인프런 얄코의 제대로 파는 자바 강의를 듣고 정리한 내용이다.
중요하거나 실무를 하면서 놓치고 있었던 부분들 위주로만 요약 정리한다.
자세한 내용은 강의를 직접 수강하는 것이 좋다.
1. 자료형
- 자바에는 1 바이트 단위의 byte, 2바이트의 short도 있지만, int를 많이 사용한다. 타 언어들 및 라이브러리와 호환성을 위해서 이기도 하고, 대부분의 CPU에서 int의 4바이트(32비트)가 처리하기 적합한 크기이기 때문이기도 하다.
- float 대비 double은 표현 범위도 넓지만 표현의 정밀도도 더 크다.
- char는 2바이트이며, 문자를 ASCII로 표시한다. 숫자와 비교할 시 정수값을 기준으로 비교하기 때문에 '1' == 49의 결과는 true이다.
- boolean도 CPU와의 호환성을 위해 1바이트(8비트)의 공간을 차지하도록 되어있다.
- String은 참조자료형이다. 따라서 .equals()로 비교해야한다. 다만 그냥 따옴표 "" 사이에 적는 문자열은 리터럴로, 리터럴 끼리는 ==으로 동등 비교가 가능하다. 이는 String constant pool의 Heap에 같은 문자열인 경우 같은 주소로 저장되기 때문이다.
2. 연산자
단축 평가(short circuit)
여러 조건을 && 또는 || 로 평가하는 경우 어떤 조건을 앞에 놔두느냐에 따라 뒤 조건은 실행되지 않는다.
- && 연산의 경우: 앞이 false이면 뒤의 것을 평가할 필요가 없다
- || 연산의 경우: 앞의 것의 true면 뒤의 것을 평가할 필요가 없다
단축 평가에 따라 연산 부하가 적은 코드를 앞에 두는 것이 리소스를 조금이라도 절약할 수 있는 방법이다.
-관련 참고 : && 연산이 || 연산보다 우선 순위가 높다.
포매팅 규칙
- "%d" : 기본
- "%13d" : n자리수 확보, 오른쪽 정렬
- "%013d" : 빈 자리수를 0으로 채움
- "%+13d" : 양수는 앞에 +를 붙임
- "%,13d" : 쉼표 사용
- "%-13d" : 자리수 확보, 왼쪽 정렬
3. 제어문
switch-case문 break
switch case문은 case마다 break가 없으면 break가 있는 위치까지 그 다음 case문들도 쭉 실행된다.
4. 상속
super() 문은 생성자에서는 자식의 필드 정의문 보다 앞에 와야한다. 메서드에서는 순서가 상관없다.
public class ClickButton extends Button {
public ClickButton(String name, boolean on) {
super(name); //super가 앞에 와야함
this.on = on;
}
@Override
public void func() {
...
super func(); //순서 상관 없음
}
}
- final을 메서드에 추가하면 해당 메서드는 Override가 불가능
- final을 클래스에 추가하면 해당 클래스는 상속이 불가능
5. 패키지
패키지 정보는 클래스의 구성 요소 중 하나로 빌드의 결과도 패키지의 구조를 따른다. Main.java 파일의 부모 디렉토리에서 단순히 아래 명령을 실행한다고 해도 컴파일이 되지 않는다. (패키지 구조는 강의 자료를 그대로 참고함)
javac Main.java
자바에서 컴파일을 하기 위해서는 패키지 정보도 반영되어야 한다. 따라서 아래 예시처럼 입력해야 정상적으로 컴파일이 되어서 .java 파일이 .class 파일로 변환되어 나타난다.
javac sec06/chap02/pkg4/Main.java
6. 메인 메서드
- main 메서드의 이름을 변경하면 실행이 불가해진다. 설정값에 main 함수의 이름과 형식이 지정되어있다.
아래 처럼 메인 메서드의 인자를 출력하게 만들고,
public class Ex02 {
public static void main(String[] args) {
for (String arg : args) {
System.out.println(arg);
}
}
}
컴파일 후 실행할 수도 있다.
javac sec06/chap05/Ex02.java
java sec06/chap05/Ex02 한놈 두시기 석삼 너구리 "다섯놈 육개장 칠면조"
7. Object
clone 메서드: Cloneable을 implement해서 사용. 메모리 주소가 바뀐다.
원시 타입은 확실히 복사해주지만 참조 타입은 참조 복사만 해주는 것에 유의. 배열, 인스턴스 등은 같은 주소를 바라보도록 shallow copy 된다. deep copy를 할려면 clone() 메서드 내부에 참조값들을 순회하면서 직접 처리해줘야한다.
8. 제너릭
개요
입력이나 출력 타입의 다형성을 위해 존재하는 타입이다. 리턴 타입 앞에 <T> 라는 식의 제너릭 타입을 지정해주면 된다. 아무 대문자나 되는데, T인 이유는 Type을 줄여서 표현하기 때문이다. 여러 개가 필요할 때는 T1, T2, T3라고 표시하기도 하고 다른 알파벳을 쓰기도 한다.
아래 예시는 T 뒤에 extends를 붙였는데, 이렇게 하면 T가 Number 타입을 상속한 클래스여야한다는 조건을 추가하는 것이다.
public static <T extends Number> double add2Num(T a, T b) {
return a.doubleValue() + b.doubleValue()
}
// <T extends Student & Human> 등과 같이 &로 여러 타입을 지정해줄 수도 있다.
와일드 카드
제너릭 클래스 자체의 다형성을 위한 문법이다. ? 기호로 사용한다.
만약 항공권 class별로 비행기마다 승객을 정한다면, 아래와 같은 상황을 가정해볼 수 있다. Economy가 Business, First의 부모로써 상속되는 구조라면 air1의 setPassenger는 최상위 부모인 Economy를 인자로 받으므로 Business, First도 처리할 수 있다.
{
AirPlane<Economy> air1 = new AirPlane<>();
air1.setPassenger(new Economy());
air1.setPassenger(new Business());
air1.setPassenger(new First());
AirPlane<Business> air2 = new AirPlane<>();
air2.setPassenger(new Economy()); //불가
air2.setPassenger(new Business());
air2.setPassenger(new First());
AirPlane<First> air3 = new AirPlane<>();
air3.setPassenger(new Economy()); //불가
air3.setPassenger(new Business()); //불가
air3.setPassenger(new First());
}
위에서는 인자의 타입을 정의하고, 그 인자를 이용하여 메서드에서 사용하는 타입을 지정했다. 그러나 와일드 카드는 클래스(AirPlane) 자체에 다형성을 적용한다.
AirPlane<? extends Business> luxuryPlane;
// luxuryPlane = new AirPlane<Economy>(); //불가
AirPlane<? super Business> lowCostPlane;
// lowCostPlane = new AirPlane<First>(); //불가
'Programming-[Backend] > Java' 카테고리의 다른 글
자바 기초 강의 정리 - 2. 컬렉션, 함수형 인터페이스, 에러와 예외 (0) | 2024.06.06 |
---|---|
gradle -Build Tools 설정, 서브 모듈, task에 대한 기본적 이해 (1) | 2024.06.02 |
자바 linter, 포매팅 처리 : spotless, googlejavaformat, commit시 자동 적용 (0) | 2024.05.26 |
[경험 요약] 자바 테스트 객체 자동으로 만들기: Instancio 라이브러리 (0) | 2024.05.20 |
[TIL][작성Java - @RequestBody null 문제: jackson, @NotNull, @NoArgsConstructor (0) | 2023.06.11 |