Coding 공부/Java

[Java_summary] var, interface, 여러 인터페이스 구현, 상속 받으면서 인터페이스 구현, 인터페이스 구현 업캐스팅, 내부 클래스(중첩 클래스), 익명 내부 클래스, 인터페이스 인스턴스화

CBJH 2024. 2. 20.
728x90
반응형

1. var 키워드

 

자바에서 var 키워드는 자바 10부터 도입되었습니다. 이 키워드는 지역 변수의 타입 추론을 가능하게 해주어, 프로그래머가 변수의 타입을 명시적으로 선언하지 않아도 컴파일러가 변수의 타입을 유추할 수 있게 해줍니다. 이는 코드를 더 간결하게 만들고, 특히 제네릭 타입이 긴 경우에 코드의 가독성을 향상시킵니다.

var를 사용할 때 주의할 점은 다음과 같습니다:

  1. 지역 변수에만 사용 가능: var는 메소드 내에서 지역 변수를 선언할 때만 사용할 수 있습니다. 클래스 멤버 변수, 메소드 파라미터, 리턴 타입에는 사용할 수 없습니다.
  2. 초기화 필수: var로 선언된 변수는 반드시 선언과 동시에 초기화되어야 합니다. 이를 통해 컴파일러가 변수 타입을 추론할 수 있습니다.
  3. 널(null)로 초기화 불가: var로 선언된 변수는 null로 초기화할 수 없습니다. 타입을 추론할 수 있는 충분한 정보가 없기 때문입니다.
  4. 배열 초기화 시 주의: var를 사용하여 배열을 초기화할 때는 타입 추론을 위해 new 키워드를 사용해야 합니다.
public class VarExample {
    public static void main(String[] args) {
        var number = 10; // int로 추론
        var message = "Hello Java"; // String으로 추론
        var list = new ArrayList<String>(); // ArrayList<String>으로 추론
        var map = new HashMap<String, Integer>(); // HashMap<String, Integer>으로 추론        
    }
}

코드의 명확성을 해칠 수 있으므로, 타입이 명확히 드러나지 않는 상황에서는 신중히 사용해야 한다.

 

var 타입은 리턴으로 사용 불가

 

1.1 var 예제

 

  • java의 var 키워드는 javaScript처럼 자유롭게 사용가능하진 않다.
  • 26줄은 Dog 객체를 업캐스팅 한 것은 Cat타입으로 강제 형변환이 안된다.
  • 32, 33줄은 30줄에서 ani가 Dog로 객체로 선언된 것이므로(업캐스팅 아님) 형제인 Cat 클래스 타입으로 강제 형변환이 안된다.
  • 35, 37줄 : 클래스 업캐스팅
  • 40, 41줄 : 메서드 매개변수 업캐스팅

2. 인터페이스(Interface)

  • Interface에서 변수는 public static final이 생략된 상태로 상수로 쓰인다. 따라서 값 수정이 안된다.
  • 메소드는 public abstract이 생략된 상태이다. 따라서 interface를 inplement해서 클래스를 만들 때 abstact 메서드를 정의해줘야 한다.

2.1 여러 인터페이스 구현

 

  • 자바에서는 하나의 클래스가 여러 인터페이스를 구현(implement)할 수 있습니다. 이는 자바가 다중 상속을 지원하지 않지만, 인터페이스를 통해 다형성과 유연성을 확장할 수 있는 방법을 제공하기 때문입니다.
  • 클래스가 여러 인터페이스를 구현할 때는 인터페이스 이름들을 콤마(,)로 구분하여 implements 키워드 뒤에 나열합니다. 각 인터페이스에서 선언된 모든 추상 메소드를 해당 클래스에서 구현해야 합니다.

 

interface Walkable {
    void walk();
}
interface Runnable {
    void run();
}
interface Swimmable {
    void swim();
}
// 하나의 클래스가 Walkable, Runnable, Swimmable 인터페이스를 모두 구현
class Person implements Walkable, Runnable, Swimmable {
    @Override
    public void walk() {
        System.out.println("Walking");
    }
    @Override
    public void run() {
        System.out.println("Running");
    }
    @Override
    public void swim() {
        System.out.println("Swimming");
    }
}

public class MultiInterfaceExample {
    public static void main(String[] args) {
        Person person = new Person();
        person.walk();
        person.run();
        person.swim();
    }
}
  • Person 클래스는 이 세 인터페이스에 정의된 walk(), run(), swim() 메소드를 모두 구현해야 합니다.
  • 이처럼 자바에서는 클래스가 여러 인터페이스를 구현할 수 있어, 다양한 기능을 클래스에 추가하고, 필요에 따라 다형성을 활용할 수 있습니다. 이 방식을 통해 자바는 단일 상속의 제한을 우회하면서도 코드의 재사용성과 확장성을 증가시킬 수 있다.

 

2.2 클래스를 상속 받으면서 인터페이스 구현

  • 자바에서 클래스는 다른 클래스를 상속받으면서 동시에 하나 이상의 인터페이스를 구현할 수 있습니다. 이는 자바의 상속과 인터페이스 구현 기능을 통해 다양한 기능의 재사용성과 확장성을 제공합니다. 클래스는 extends 키워드를 사용하여 단 하나의 클래스만 상속받을 수 있으며(다중 상속은 지원하지 않음), implements 키워드를 사용하여 하나 이상의 인터페이스를 구현할 수 있다.

 

2.3 인터페이스의 구현 및 업캐스팅

  • 인터페이스도 다른 인터페이스를 상속받을 수 있다.
  • 인터페이스도 인스턴스 생성은 안되지만 변수 생성은 가능하고, 업캐스팅도 가능하다.

  • 인터페이스를 상속받은 인터페이스를 상속받는 클래스를 만들 수 있다.
  • 상속받는 기본 속성은 모두 지켜야한다.

static 내부 클래스 예제

  • 객체없이 메모리를 사용할 수 없다.
  • 내부 static class는 멤버이므로, 외부 클래스 객체 생성없이 사용할 수 있다.
  • 내부 static class객체만 생성해서 내부 클래스의 메서드를 사용할 수 있다.
  • outerClass 인스턴스 생성 없이 InnerClass3만 생성해도 printInfo내부 메서드를 사용할 수 있다.

 

2.4 클래스 메서드의 내부 클래스

 

  • OuterClass의 멤버가 아니라 내부 클래스의 멤버이므로 외부에서 displayInfo를 불러올 수 없다.
  • OuterClass의 메서드 printInfo를 불러올 때만 사용할 수 있는 내부 클래스 InnerClass2(익명 클래스라고도 불린다.)
  • 익명 클래스는 외부에서 누구인지 알 수 없다. 
  • class의 필드(멤버)와 행위(메서드)를 구분하고 이해하자.

 

2.5 익명 내부 클래스로 인터페이스 인스턴스 생성하는 예제

일회성 인터페이스 객체 생성(익명 내부 클래스 활용)

 

2.6  클래스 중첩

 

클래스 중첩 활용 방법

1. 로직 그룹화와 캡슐화 향상

  • 중첩 클래스는 주로 그들을 둘러싼 외부 클래스와 강하게 연관된 작업을 수행할 때 사용됩니다. 이러한 방식으로 코드를 구성하면, 관련된 기능을 함께 그룹화하여 캡슐화를 향상시킬 수 있습니다.

2. 네임스페이스 관리

  • 내부 클래스를 사용하면 클래스의 네임스페이스를 더 잘 관리할 수 있습니다. 외부에서는 덜 중요한 클래스를 내부 클래스로 숨겨서, 사용하는 쪽의 인터페이스를 더 깔끔하게 유지할 수 있습니다.

3. 접근 제어와 보안

  • 내부 클래스는 외부 클래스의 private 멤버에도 접근할 수 있습니다. 이를 통해, 외부로 노출할 필요가 없는 클래스를 숨기고, 외부 클래스의 멤버 변수에 대한 접근을 제어할 수 있습니다.

4. 익명 클래스로 리스너 구현

  • GUI 기반 애플리케이션 개발 시, 익명 내부 클래스를 사용하여 이벤트 리스너를 간편하게 구현할 수 있습니다. 이 방법은 코드를 간결하게 유지하면서도 이벤트 처리 로직을 쉽게 추가할 수 있게 해 줍니다.

5. 정적 내부 클래스를 통한 유틸리티나 상수 클래스 구현

  • 정적 내부 클래스는 외부 클래스의 인스턴스 없이도 사용할 수 있기 때문에, 관련된 유틸리티 함수나 상수 모음을 정의하는 데 유용합니다. 예를 들어, 특정 클래스의 작동과 밀접하게 관련된 유틸리티 메서드나 상수를 내부적으로 관리할 수 있습니다.

6. 지역 클래스와 익명 클래스로 일회성 사용

  • 특정 메소드 내에서만 사용되는 클래스를 정의할 때 지역 클래스나 익명 클래스를 사용할 수 있습니다. 이는 코드의 가독성을 높이고, 그 범위를 제한하여 불필요한 접근을 방지할 수 있습니다.

 

클래스 중첩은 코드의 구조를 더 명확하게 하고, 캡슐화를 향상시키며, 특정 문맥에서의 사용을 명확하게 하는 등 다양한 이유로 활용됩니다. 따라서, 중첩 클래스의 사용은 자바 프로그래밍에서 강력한 설계 도구 중 하나로 간주됩니다.

 
 
  • 2.4번 부터 다음 시간에 복습 할 예정.
  • 익명 클래스 문법이나 인터페이스를 객체없이 인스턴스화 시켜서 일회성으로 사용하는 방법에 대한 이해가 어렵다. 연습문제를 풀며 적응해나가자.

 

 

 

댓글