Java

[Java][Tutorial] 1-3. Learning the Java Language: Classes and Objects

noahkim_ 2024. 1. 14. 21:31

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(); }
}

 

 

출처