💡 해당 글은 『자바의 신 3판』을 복습하며 도서의 내용과 본인의 주관적인 생각을 정리한 글입니다.
☁️ 내용정리
객체지향 개발과 관련된 용어들
클래스
- 상태와 행위를 가지는 자바의 정적인 기본 단위이다. 객체를 생성하기 위한 레시피이다.
상태와 행위
- 상태란 클래스 혹은 인스턴스 변수이다. 행위는 메서드이다.
캡슐화
- 캡슐화는 상태와 행위를 하나의 클래스로 묶는 것이다. 캡슐화를 통해 외부로 공개하지 않아도 되는 상태 혹은 행위에 접근을 막을 수 있다.
메시지
- 메서드에서 다른 메서드를 호출하는 상호작용을 의미한다. 값을 전달할수도 하지 않을 수도 있다.
객체
- 객체란 클래스를 기반으로 생성되어 힙에 할당된 인스턴스이다.
상속
- 상속이란 다른 클래스의 자원을 물려받아 사용할 수 있다는 개념이다. 클래스를 확장하는 것과 인터페이스를 구현하는 것을 아울러 상속이라 칭한다.
다형성
- 다형성이란 부모 클래스를 상속하는 자식클래스들이 서로 다른 기능을 수행할 수 있는 것이다.
- 자식 클래스는 본인의 타입만이 아닌 부모클래스 타입으로도 선언될 수 있고, 실제 기능은 본인의 고유한 기능을 수행하는 것을 다형성이라고 한다.
overriding
- 부모 클래스의 메서드를 자식 클래스에서 자신만의 기능으로 덮어 쓰는 것을 오버라이딩이라고 한다.
- 런타임 다형성이라고 불린다.
- 상속과 오버라이딩을 통해 여러 클래스를 부모 클래스의 타입으로 묶어 선언할 수 있고, 이를 통해 클래스간 의존도를 낮출 수 있다.
overloading
- 한 클래스에서 동일한 이름의 메서드를 매개변수 시그니처만 다르게하여 여러 개 선언할 수 있는 것을 오버로딩이라고 한다.
- 컴파일타임 다형성이라고 불린다.
- 오버로딩을 통해 동일한 기능을 수행하지만 매개변수가 다른 메서드를 하나의 이름으로 묶어 선언할 수 있다. 이를 통해 불필요한 메서드 이름의 선언을 줄일 수 있고, 코드의 가독성을 높일 수 있다.
패키지와 임포트
패키지
- 패키지란 클래스들을 그룹화 하기 위한 단위이다.
- 패키지가 존재하지 않는다면, 같은 이름의 클래스를 선언할 수 없을 것이고, 모든 클래스가 연관성 없이 한 데 모여 코드를 관리하기 힘들 것이다.
- 패키지 선언은 코드의 가장 상단에 존재해야 한다. 주석이나 공백은 괜찮다.
- 최상위 패키지는 java, javax로 선언할 수 없다. 이미 자바에서 사용중이기 때문이다.
- 패키지는 예약어가 될 수 없다. 자바에서 예약어로 사용중이기 때문이다.
- 패키지 이름은 모두 소문자로 구성하는 것이 일반적이다.
임포트
- 다른 패키지에 존재하는 클래스를 사용하기 위한 예약어이다.
- 다른 패키지의 클래스에 존재하는 static을 참조할 때, static import를 사용할 수 있다.
- 특정 패키지의 모든 클래스를 참조하려면 와일드카드(*)을 사용하면 된다.
- 클래스를 컴파일하면 해당 클래스를 컴파일하기 전에 임포트된 클래스를 먼저 컴파일한다. 따라서 와일드 카드를 통해 다른 패키지를 참조하면 해당 패키지에 존재하는 모든 클래스를 컴파일 하기 때문에 조금이라도 컴파일러의 부담을 줄이기 위해서는 사용을 지양하는 것이 좋다.
- 임포트 코드는 컴파일 이후 사라진다.
자바에서 사용되는 타입의 종류
primitive type
(원시 타입)- 원시 타입은 값을 가지는 타입이다.
- byte, char, short, int, long, float, double, boolean 총 8종류가 존재한다.
- char를 제외한 모든 원시타입의 첫 번째 비트는 부호 비트이다. (char는 음수가 존재하지 않음)
- boolean을 제외하고, 자신보다 큰 저장공간을 가지는 타입으로 자동 타입 캐스팅이 가능하다.
- 자신보다 작은 저장공간을 가지는 타입으로는 명시적으로 타입 캐스팅을 선언해주어야 한다.
reference type
(참조 타입)- 참조 타입은 heap의 메모리에 존재하는 객체의 참조 주소 값을 가진다.
.
키워드를 통해 참조 타입의 프로퍼티 혹은 메서드에 접근할 수 있다.
변수의 종류
지역 변수
- 지역 변수는 중괄호(블럭) 내에서만 존재하는 변수이다.
- 중괄호를 벗어나면 접근할 수 없다. static 블럭 포함
매개 변수
- 매개 변수는 메서드로 전달되는 변수이다.
- 값 혹은 참조 값을 변수라는 공간에 복사하여 전달한다.
- 따라서 참조 값을 전달하는 경우 외부 변수가 참조하는 인스턴스와 동일한 주소를 가리키기 때문에 내부 프로퍼티의 변경에 유의하여 사용해야 한다.
- 메서드의 호출이 종료되면 소멸한다.
클래스 변수
- 클래스 변수는 클래스 내에 static으로 선언된 변수이다.
- JVM의 static영역에 저장되며, 자바 프로그램이 종료될 때 소멸한다.
인스턴스 변수
- 객체가 가지는 변수이다. 객체가 GC에 의해 수거될 때, 소멸한다.
접근 제어자
public
- 모든 패키지의 모든 클래스에서 접근 가능한 권한이다.
protected
- 같은 패키지 혹은 자신을 상속하는 클래스에서 접근 가능한 권한이다.
package-private
- 같은 패키지에서만 접근 가능한 권한이다.
private
- 같은 클래스에서만 접근 가능한 권한이다.
- 유의할 점은 본인의 인스턴스에서만 접근가능한 것이 아닌, 같은 클래스라는 점이다.
자바를 구성하는 클래스, 인터페이스, abstract 클래스
클래스
- 일반적인 클래스이다.
- extends로 상속받을 수 있다. final로 선언하면 더 이상 상속이 불가능하다.
- 하나의 클래스가 여러 클래스를 상속하는 다중 상속이 불가능하다.
인터페이스
- 구현하지 않은 메서드를 포함할 수 있는 클래스이다.
- implements 예약어를 통해 상속받을 수 있다.
- 하나의 클래스가 여러 인터페이스를 상속하는 다중 상속이 가능하다.
- 인터페이스끼리의 상속도 가능하다.
- java8 부터는 interface에 staic과 default 메서드를 지원한다. 인터페이스에서 메서드를 구현할 수 있다.
- java9 부터는 interface에 private 접근 권한이 지원된다. private 접근 권한을 가지는 메서드는 반드시 interface 내부에서 메서드 로직이 구현되어 있어야 한다.
- default 메서드에서 로직을 분리하고 외부로 해당 로직을 감추기 위함인 것 같다. 어찌 점점 abstract 클래스의 완벽한 상위호환이 되는 것 같다.
추상클래스
- abstract 클래스는 클래스에서 일부 메서드만 구현되어 있는 클래스이다.
- class 앞에 abstract예약어를 추가하여 선언할 수 있다.
- 구현되지 않은 메서드는 메서드 선언부에 abstract 예약어를 사용해야 한다.
- abstract 클래스를 상속받은 클래스가 abstract 메서드를 하나라도 구현하지 않는다면 abstract 클래스로 선언해야 한다.
- 클래스와 동일하게 다중 상속이 불가능하다.
enum
- 여러 상수를 하나의 타입으로 저장할 수 있는 열거체 이다.
- 상수는 모두 객체이다.
- 상속이 불가능하다.
어노테이션
- 어노테이션은 컴파일러 혹은 런타임에 부가적인 정보를 제공하기 위해 사용된다.
- 어노테이션을 선언하기 위해 사용하는 어노테이션을 메타 어노테이션이라고 하며, Target, Retention 등이 존재한다.
- 어노테이션을 선언한 생명주기에 따라 컴파일 이후 삭제되거나, 바이트코드에서 삭제되거나, 런타임에서 삭제된다.
예외
모두 Throwable 클래스를 확장한다.
예외를 발생한 메서드에서 처리하지 않는 경우 throws 예약어를 통해 명시해주는 것이 좋다. 필수는 아니지만 개발자가 메서드를 사용할 때 IDE를 통해 어떤 예외가 발생하는지 확인할 수 있다.
Error
- 자바 프로그램 외부에서 발생한 오류를 의미힌다.
Check Exception
- 컴파일 타임에 확인하고 반드시 catch하여 예외의 처리를 구현해야 하는 예외이다.
- Exception을 상속하여 커스텀 예외 클래스를 생성하면 Checked Exception에 포함된다.
- IOException, ClassNotFoundException 등이 있다.
Unchecked Exception
- RuntimeException 클래스를 확장하는 예외이다.
- 런타임에서 발생하며, 발생한 예외를 처리하지 않는 경우 해당 스레드는 종료된다.
String, StringBuffer, StringBuilder
모두 charSequence 인터페이스를 확장한다.
StringBuile, StringBuffer는 AbstractStringBuilder를 확장한다.
- String
- 불변으로 문자열을 관리하는 클래스
- 내부적으로 final 바이트 배열을 통해 문자열을 관리한다.
- StringBuilder
- String과 동일하게 내부적으로 바이트 배열로 문자열을 저장한다. 다른 점은 final이 아니라는 점, 이는 문자열을 변경할 수 있다는 의미이다.
- 불필요한 문자열 객체를 생성하지 않고 연산을 수행하기 위해 append, insert등의 메서드를 지원한다.
- thread-safe하지 않다.
- StringBuffer
- thread-safe하다. 나머지는 StringBuilder와 동일하다.
'JAVA > 자바의 신' 카테고리의 다른 글
20장. 가장 많이 쓰는 패키지는 자바랭 (1) | 2024.01.09 |
---|---|
19장. 이쯤에서 자바의 역사와 JVM에 대해서 알아보자 (0) | 2024.01.08 |
17장. 어노테이션이라는 것도 알아야 한다. (0) | 2024.01.08 |
16장. 클래스 안에 클래스가 들어갈 수도 있구나 (0) | 2024.01.07 |
15장. String (1) | 2024.01.07 |