Java(Array, Class)
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: 필드 값을 설정하는 메서드
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 키워드 사용 불가