The Java Tutorials have been written for JDK 8
3. Classes and Objects
Constant
- 값을 수정할 수 없는 필드입니다.
- final 키워드로 표기합니다.
Access Control
- 외부 클래스로부터 접근 제한 레벨을 지정하는 키워드입니다.
Inner Classes
- 클래스 내부에 선언된 클래스 입니다.
접근 제한
- Static class : 밖에 있는 필드에 접근할 수 없습니다.
- Non-Static class : 밖에 있는 필드에 접근할 수 있습니다.
Nested Classes
- 내부 클래스를 가지고 있는 클래스
사용하는 이유
- 오직 클래스 안에서만 사용되도록 논리적으로 묶는 유용한 방법입니다.
- 캡슐화 효과를 얻을 수 있습니다.
직렬화
- 중첩 클래스의 직렬화는 비권장됩니다.
- 내부 클래스를 직렬화 할 때 합성 구성요소를 생성하는데 서로 다른 JRE 에서 직렬화를 수행할 경우 문제가 발생할 수 있습니다.
- 다른 JRE 구현 간의 호환성 문제를 피하기 위해 내부 클래스의 직렬화는 피하는 것이 좋습니다.
Anonymous Classes
HelloWorld frenchGreeting = new HelloWorld() {
String name = "tout le monde";
public void greet() {
greetSomeone("tout le monde");
}
public void greetSomeone(String someone) {
name = someone;
System.out.println("Salut " + name);
}
};
- 이름이 없는 지역 클래스와 유사합니다.
사용 예
- 인터페이스를 구현하거나 클래스를 확장할 때 사용됩니다.
- 주로 한 번만 사용할 지역 클래스의 경우 사용됩니다.
장점
- 익명 클래스는 코드를 더 간결하게 만들어 줍니다.
- 클래스 선언과 인스턴스화를 동시에 할 수 있습니다.
- 코드 블록내에 클래스 정의가 포함됩니다.
접근 제한
- 익명 클래스는 그것을 포함하고 있는 클래스의 멤버에 접근할 수 있습니다.
- final 또는 효과적으로 final로 선언되지 않은 지역 변수에는 접근할 수 없습니다.
Lambda Expression
- 간결한 방법으로 익명 함수를 표현할 수 있게 해줍니다.
- 주로 함수형 인터페이스와 인스턴스를 생성할 때 사용됩니다.
- 함수를 인수로 전달하거나 코드를 데이터로 취급하는 함수형 프로그래밍을 Java에서 구현할 수 있게 되었습니다.
printPersonsWithPredicate(
roster,
p -> p.getGender() == Person.Sex.MALE
&& p.getAge() >= 18
&& p.getAge() <= 25
);
Functional Interface
- 하나의 추상 메서드만을 가진 인터페이스를 의미합니다.
- @FunctionalInterface 어노테이션을 사용하여 명시적으로 나타낼 수 있습니다.
- Predicate, Consume 등의 인터페이스를 제공합니다.
- Stream API의 Aggregate 연산과 같은 고차 함수에서 인자로 사용될 때 유용합니다.
Enum Types
- 미리 정의된 상수 집합을 표현할 수 있습니다.
- 문맥에 맞는 동작과 정보를 Enum 상수와 연결할 수 있습니다.
- 코드내에서 한정된 값 집합만을 사용하도록 강제할 수 있어 타입 안전성을 높이고 잘못된 값의 사용을 방지할 수 있습니다.
- 컴파일에서 자동으로 내장함수를 생성합니다
- values() : Enum의 모든 상수를 배열로 반환합니다.
- valueOf() : 주어진 문자열에 해당하는 Enum 상수를 반환합니다.
- body 에 메서드나 필드를 가질 수 있습니다.
public enum Planet {
MERCURY (3.303e+23, 2.4397e6),
VENUS (4.869e+24, 6.0518e6),
EARTH (5.976e+24, 6.37814e6),
MARS (6.421e+23, 3.3972e6),
JUPITER (1.9e+27, 7.1492e7),
SATURN (5.688e+26, 6.0268e7),
URANUS (8.686e+25, 2.5559e7),
NEPTUNE (1.024e+26, 2.4746e7);
private final double mass;
private final double radius;
public static final double G = 6.67300E-11;
Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
}
private double mass() { return mass; }
private double radius() { return radius; }
double surfaceGravity() { return G * mass / (radius * radius); }
double surfaceWeight(double otherMass) { return otherMass * surfaceGravity(); }
}
출처
'Java' 카테고리의 다른 글
[Java][Tutorial] 1-2. Learning the Java Language: Language Basics (0) | 2024.01.14 |
---|---|
[Java의 정석] 13-3. 스레드: 실행 제어 (1) | 2023.11.30 |
[Java의 정석] 13-4. 스레드: 동기화 (0) | 2023.11.30 |
[Java의 정석] 15-6. 입출력: Serialization (0) | 2023.11.29 |
[Java의 정석] 15-5. 입출력: File (1) | 2023.11.29 |