728x90
반응형
1. var 키워드
자바에서 var 키워드는 자바 10부터 도입되었습니다. 이 키워드는 지역 변수의 타입 추론을 가능하게 해주어, 프로그래머가 변수의 타입을 명시적으로 선언하지 않아도 컴파일러가 변수의 타입을 유추할 수 있게 해줍니다. 이는 코드를 더 간결하게 만들고, 특히 제네릭 타입이 긴 경우에 코드의 가독성을 향상시킵니다.
var를 사용할 때 주의할 점은 다음과 같습니다:
- 지역 변수에만 사용 가능: var는 메소드 내에서 지역 변수를 선언할 때만 사용할 수 있습니다. 클래스 멤버 변수, 메소드 파라미터, 리턴 타입에는 사용할 수 없습니다.
- 초기화 필수: var로 선언된 변수는 반드시 선언과 동시에 초기화되어야 합니다. 이를 통해 컴파일러가 변수 타입을 추론할 수 있습니다.
- 널(null)로 초기화 불가: var로 선언된 변수는 null로 초기화할 수 없습니다. 타입을 추론할 수 있는 충분한 정보가 없기 때문입니다.
- 배열 초기화 시 주의: 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>으로 추론
}
}
코드의 명확성을 해칠 수 있으므로, 타입이 명확히 드러나지 않는 상황에서는 신중히 사용해야 한다.
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 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번 부터 다음 시간에 복습 할 예정.
- 익명 클래스 문법이나 인터페이스를 객체없이 인스턴스화 시켜서 일회성으로 사용하는 방법에 대한 이해가 어렵다. 연습문제를 풀며 적응해나가자.
댓글