WEB개발/TIL

Java(Array, Class)

nanannannana 2023. 3. 6. 20:03
반응형

Array

: 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것

1. 배열 생성

// 배열 선언
int[] intArray;
char[] charArray;

// 배열 생성
int[] intArray = new int[10]; //[0,0,0,0 ...,0] = length 10
char[] charArray = new char[20] //[ , , , , ..., ] = length 20

// 배열 초기화
int[] intArray = {1,2,3,4,5}

 

2. 배열 출력

  • for문 활용
// intArray = [1,2,3,4,5]
for (int i=0 ; i<intArray.length ; i++) {
	System.out.print(intArray[i] + " "); // 1 2 3 4 5
}
  • for-each문 활용
// for-each문 구조
for (type var: iterate) {
    body-of-loop
}

// for-each문 예시
// intArray = [1,2,3,4,5]
for (int value: intArray) {
	System.out.print(value + " "); // 1 2 3 4 5
}

iterate: 루프를 돌릴 객체

  • iterate의 자료형은 루프를 돌릴 수 있는 자료형(배열 및 ArrayList 등)만 가능

var: iterate의 요소가 순차적으로 대입


  • Arrays 클래스의 toString 메서드 활용

: Arrays 클래스는 배열을 다루기 위한 다양한 메서드가 포함되어 있음

import java.util.Arrays;
...
System.out.println(Arrays.toString(intArray)); // [1, 2, 3, 4, 5]

 

3. 2차원 배열

// 2차원 배열 선언
int[][] intArray;
char[][] charArray;
double[][] doubleArray;

// 2차원 배열 생성
int [][] intArray = new int[2][5];
char [][] charArray = new char[5][5];
double [][] doubleArray = new double[5][2];

// 2차원 배열 초기화
int intArray[][] = {{0,1,2},{3,4,5},{6,7,8}};
char charArray[][] = {{'a','b','c'},{'d','e','f'}};
double doubleArray[][] = {{0.01,0.02},{0.03,0.04}}

 

4. 2차원 배열 출력

  • 이중 for문 활용
//intArray = {{0,1,2},{3,4,5}};
for (int[] arr : intArray) {
	for (int value: arr) {
		System.out.print(value + " ");
	}
	System.out.println("");
}
// console:
// 0 1 2
// 3 4 5

 

 

ArrayList

: 크기를 미리 정하지 않아도 되는 배열

  • 표준 배열보다 조금 느림

=> 그러나, 배열에서 많은 조작이 필요할 때 유용하게 사용되는 클래스

 

1. ArrayList 배열 생성

import java.util.ArrayList;
...
ArrayList<Integer> arrayList1 = new ArrayList<>();
ArrayList<String> arrayList2 = new ArrayList<>();
ArrayList<Double> arrayList3 = new ArrayList<>();

 

2. ArrayList 메서드

  • add(element): ArrayList 맨 마지에 element 추가
  • add(index, element): index위치에 element 삽입
ArrayList<Integer> arr = new ArrayList<>();
// arr 맨 마지막에 2 추가
arr.add(2); // arr = [2]
// arr의 0번째 인덱스에 1추가
arr.add(0,1); // arr = [1,2]
  • addAll(ArrayList): ArrayList 끝에 ArrayList 추가
// arr = [1,2,3]
arr.addAll(arr); // arr = [1,2,3,1,2,3]
  • size(): ArrayLis의 길이 리턴 (=length)
  • get(index): index에 해당하는 요소 리턴
arr.get(i)
= arr[i]

 

 

예외처리

: 프로그램 실행 중 의도치 않은 결과가 나오는 것을 방지

<-> 컴파일 오류: 문법에 맞지 않게 작성된 코드가 있을 경우 발생

 

1. 예외 발생 예시

  • 숫자를 0으로 나누는 경우
  • 배열의 인덱스 범위를 벗어나는 경우
  • 정수를 입력받도록 작성한 코드에 문자열을 입력한 경우
  • ...etc

 

2. try-catch-finally문

에러 예시

Exception in thread "main" java.lang.ArithmeticException: / by zero
	at java_first_project.예외처리.main(예외처리.java:8)

try-catch-finally문을 사용하여 예외처리

// try-catch-finally문 기본 구조
try {
	// 예외가 발생할 가능성이 있는 실행문
} catch (처리할 예외 타입 선언) {
	// 예외 처리문
} finally {
	// 예외 발생 여부와 상관없이 무조건 실행되는 문장
	// 생략 가능
}

 

예외 처리 예시

1. 숫자를 0으로 나누는 경우

int num1 = 5;
int num2 = 0;

try {
	System.out.println(num1/num2);
} catch (ArithmeticException e) {
	System.out.println("0으로 나눌 수 없음");
} finally {
	System.out.println("끝");
}
// console: 0으로 나눌 수 없음

2. 정수를 입력받도록 작성한 코드에 문자열을 입력한 경우

import java.util.Scanner;
...
Scanner scanner = new Scanner(System.in);
try {
	int num = scanner.nextInt();
	System.out.println(num);
} catch (InputMismatchException e) {
	System.out.println("error: 숫자만 입력 가능");
}
scanner.close();
// console
//	문자열 입력하는 경우 => error: 숫자만 입력 가능
//	숫자 입력하는 경우 => 입력한 숫자 표시

 

 

객체지향 프로그래밍

: 필요한 데이터와 코드를 묶어 하나의 객체 생성

-> 생성된 객체들 간에 상호작용을 하도록 프로그램을 만드는 방식

 

장점: 코드 재사용에 용이, 유지보수 용이

단점: 처리속도가 느림, 설계가 복잡함

 

클래스

클래스의 구조

public class ClassName {
	// 필드(변수)
	public int number;
	public String name;

	// 생성자
	public ClassName() {}

	// 메서드
	public String getName() {
		return name;
	}
}
  • 필드(변수): 클래스 내에서 값을 저장하는 변수
  • 메서드: 클래스 내에 선언된 함수
  • 생성자: 객체가 생성될 때 자동으로 호출되는 메서드

 

메서드 형태

// 접근제어자 + 리턴 타입 + 함수명
public void test() {}

생성자 형태

  • 생성자명 = 클래스명
  • 생성자는 리턴 타입을 적지 않음
// 클래스
public class ClassName {
	// 생성자
	public ClassName(){}
}

 

클래스 사용하기

// Main.java

/public class Main {
	public static void main(String[] args) {
		ClassName test = new ClassName();
	}
}
  • test 객체: ClassName 클래스의 인스턴스

참고) https://palette77.tistory.com/26

 

 

 

접근제어자

참고) 자바의 package: 관련있는 클래스 파일을 저장하는 공간

접근제어자 목적: 클래스나 일부 멤버(필드, 메서드)에 외부 접근을 제한하기 위함

 

접근 제어자 종류

public: 패키지에 관계 없이 모든 클래스에서 접근 가능

protected: 동일 패키지와 자식 클래스에 허용

default: 같은 패키지 내의 모든 클래스에서 접근 가능 (다른 패키지에서 접근 불가)

private: 같은 클래스에서만 접근 가능

 

getter & setter

  • 클래스에서 필드(변수)는 private로 지정하는 것이 일반적

=> 간접적으로 필드에 접근할 수 있도록 public 메서드 제공

=> 이것을 getter와 setter라고 함

 

getter: 필드 값을 가져오는 메서드

setter: 필드 값을 설정하는 메서드

getter & setter 자동 생성

 

 

Static

static 멤버(변수/메서드)

  • 객체마다 생성X, 클래스당 하나만 생성
  • 클래스가 생성되는 순간 메모리를 할당 받음

    = 객체를 생성(= 클래스의 인스턴스화)하지 않아도 static 멤버에 접근 가능

  • 동일한 클래스의 모든 인스턴스에 공유됨
  • non-static의 경우, 객체가 생성될 때마다 멤버 공간을 새로 만듦(=메모리 공간 공유X)

 

static 멤버 사용 예시

// StaticPrac 클래스
public class StaticPrac {
	// static
	public static String hello = "hello";
	public static int number = 10;
	// non-static	
	public String hi = "hi";
}

// ClassPrac 클래스
System.out.println(StaticPrac.hello); //hello
System.out.println(StaticPrac.hi); //error발생

StaticPrac num = new StaticPrac();
num.number = 5;
System.out.println(num.number); // 10 
// 모든 인스턴스가 하나의 공간을 공유하기 때문에 값이 변하지 않고 기존값 10이 출력됨
System.out.println(StaticPrac.number); // 10

 

static의 활용

  • 보통 static 변수는 공유 목적으로 많이 사용됨
  • static 메서드는 유틸리티성 메서드를 작성할 때 많이 사용됨
참고) 유틸리티 클래스, 유틸리티 메서드
: 매개변수에 대해 작업을 수행하는 정적 메서드만 있는 클래스

ex) Math 클래스

// 객체를 생성하지 않아도 사용 가능
System.out.println(Math.abs(-5)); //5

 

static의 제약

  • static 메서드에서 non-static 멤버에 접근할 수 없음

    = 객체를 생성하지 않고서는 non-static멤버를 사용할 수 없기 때문

  • 반대로, non-static 메서드는 static 멤버에 접근 가능
  • static 메서드에서는 this 키워드 사용 불가
반응형