자바코드 실행과정
- 자바소스코드(.java) => 컴파일러 => 자바 바이트 코드(.class) => 자바가상머신(JVM)에서 실행
- 자바는 운영체제 독립적이라 JVM만 있으면 어느 운영체제든 실행가능
식별자
- @, #, !와 같은 특수문자 사용 불가(_랑 $는 사용가능)
- 공백 불가
- 한글 가능하나 사용하지 않기
- 예약어 식별자 불가
- 숫자사용가능(그러나 첫글자 x)
Data Type
- 자바는 강한 타입언어로, 데이터 타입을 선언해줘야 한다
1. 기본타입 : 값을 바로 넣기
- boolean ⇒ 논리
- char ⇒ 문자
- byte, short, short, int, long ⇒ 정수타입
- float, double ⇒ 실수타입
2. 레퍼런스타입(참조형) : 값이 들어있는 메모리 주소가 들어감
- 배열에 대한 레퍼런스
- 클래스에 대한 레퍼런스 (ex. String)
- 인터페이스에 대한 레퍼런스
입력과 출력
1. 출력
- System.out.print : 줄바꿈 X
- System.out.println : 줄바꿈 O
2. 입력
Scanner 클래스 주요 메소드
- next() : 공백 이전까지의 문자열 읽음
- nextLine() : 엔터(\n) 이전까지의 문자열을 읽음
- nextInt(), nextDouble(), nextBoolean(), nextFloat() ... etc : 공백 이전까지의 특정 자료형을 읽음
- close() : scanner 닫음
연산자
반복문
for(int i = 0; i<9; i++) {
System.out.println(i);
}
int i = 0;
while(i<10) {
System.out.print(i + " ");
i++;
}
while vs do-while
int i = 10;
while(i<10) {
System.out.print(i + " ");
i++;
}
System.out.print("\n");
int j = 10;
do {
System.out.print(j + " ");
j++;
}while(j < 10);
메소드
- 클래스 안에 있는 함수
- 반환값이 없는 경우 void, 있으면 반환값의 변수타입을 지정해줘야 한다.
Array
- 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것
int i = 10;
while(i<10) {
System.out.print(i + " ");
i++;
}
System.out.print("\n");
int j = 10;
do {
System.out.print(j + " ");
j++;
}while(j < 10);
for(int value : arr1) {
System.out.print(value + " ");
}
배열 출력
- Array 클래스의 toString 메소드 활용
2차원 Array
ArrayList
- 표준 Array보다 조금 느릴 수 있지만 배열에서 많은 조작이 필요할 때 유용
- 크기를 미리 정하지 않아도 된다
- 제너릭으로 선언
ArrayList<Integer> arr1 = new ArrayList<>();
ArrayList 메서드
- 값 추가
- add(a) : element1을 맨 뒤에 추가
- add(a, b) : 인덱스가 a인곳에 b를 추가한다
- addAll(배열) : 배열 전체를 뒤에 추가한다
- 값 가져오기
- get(a) : 인덱스가 a인 곳의 값을 가져온다
- size() : arrayList는 length를 사용하지 않고 size를 사용한다
- indexOf(a) : a값의 첫번째 인덱스를 가져온다
- lastIndexOf(a) : a값의 마지막 인덱스를 가져온다
- 값 제거하기
- remove(a) : 인덱스가 a인 값을 제거, a가 값이 아니라 인덱스다!
- clear : arrayList 모두 비우기
예외처리
🔥컴파일 오류 vs 예외
예외가 발생하는 경우
- 숫자를 0으로 나누는 경우
- 배열의 인덱스 범위를 벗어나는 경우
- 정수를 입력받도록 작성한 코드에 문자열을 입력한 경우
- import 필요
- import java.util.InputMismatchException;
- ...etc
try-catch-finally
- 예외 처리를 위한 방법
- try : 예외 발생 가능성이 있는 실행문
- catch : 예외 처리문
- finally : 예외 유무와 상관없이 실행
자바의 패키지
- 관련있는 클래스 파일을 저장하는 공간
객체지향 프로그래밍
- 필요한 데이터와 코드를 묶어 하나의 객체로 만들고, 이 객체들 간에 상호작용을 하도록 프로그램을 만드는 방식
장점
단점
클래스
구조
- 필드 : 클래스 내에서 값을 저장하는 변수
- 생성자 : 객체가 생성될 때 자동으로 실행되는 메소드
- 메소드 : 클래스 내에서 선언된 함수
메소드 형태
생성자
- 이름이 클래스 이름과 같아야 한다
- 리턴 타입을 적지 않는다
접근 제어자
- 목적 : 클래스나 일부 멤버(필드, 메소드)를 외부에서의 접근 제한을 걸어두는 것
접근 제어자 종류
- public : 모든 클래스 허용
- protected : 다른 패키지 x, 동일 패키지 가능, 자식 클래스는 모두 허용
- default : 동일 패키지에서만
- private : 같은 클래스에서만
클래스의 사용
getter & setter
- 클래스에서 필드(변수)는 private으로 지정하는게 일반적
- 따라서 간접적으로 필드에 접근할 수 있도록 public 메소드를 제공
- 이것을 getter와 setter라고 한다
- getter : 필드값을 가져올 때
- setter : 필드값을 설정할 때
static
- 객체마다 생성되는 것이 아니고 클래스당 하나만 생성
- 클래스가 생성되는 순간 메모리를 할당받음
- 즉 객체를 생성하지 않아도 static 멤버에 접근 가능
- 동일한 클래스의 모든 인스턴스에 공유(같은 메모리 공간 공유)
- non-static의 경우 객체가 생성될 때마다 멤버 공간을 새로 만든다 -> 메모리 공간이 공유되지 않음
static 변수의 사용
- 보통 static 변수는 공유의 목적으로 많이 사용됨
- static 메소드는 유틸리티성 메소드를 작성할 때 많이 사용됨
- ex ) 오늘의 날짜 구하기, 숫자에 콤마 추가하기 등
static의 제약
- static 메소드에서 non-static 멤버에 접근할 수 없음
- 객체가 생성되지 않은 상태에서 nonstatic멤버는 만들어져있지 않아서
- non-static 메소드에서 static 멤버는 접근 가능
- static 메소드에서는 this 불가
클래스의 상속
- 부모 클래스에서 정의된 필드와 메소드를 자식 클래스가 물려받는 것
- extends 키워드 사용
- super는 첫줄에 쓰기
장점
- 멤버의 중복 작성 제거
- 클래스의 계층적 분류 가능
- 클래스의 재사용과 확장성 용이
메소드 오버로딩
- 같은 이름으로 메소드를 여러개 생성
- 대신 매개변수가 달라야한다
메소드 오버라이딩
- 부모 클래스에 정의한 메소드를 자식 클래스에서 다시 정의
- 매개변수, 이름 등등 모두 같아야한다(내용만 다르게)
후기
그동안 배웠던 자바스크립트에 비해 자료형을 명확히 해줘야하는 언어를 배우게 돼서 좋은 경험이라고 생각한다. 그리고 클래스의 개념을 잡는게 아직도 조금 헷갈리지만 클래스를 사용하면서 리액트에서 컴포넌트로 나누는 것처럼 동작(메소드를) 나누게 되면서 코드가 간단해지는건가 라는 생각을 했다.