Home 7/20 JAVA 강의
Post
Cancel

7/20 JAVA 강의

7월 20일 (목) 자바 개념 정리


Interface

멤버 변수 public static final
멤버 메소드 public abstract

상속 관계가 없는 클래스들에게 인터페이스를 통해 관계 부여로 다형성 도모 집합을 생각해보면 포함 관계는 상속이고, 교집합 관계는 인터페이스로 생각하면 된다.

인터페이스를 상속 받으면 public 메소드 밖에 못 쓴다 (다른 접근 제한자 못 씀) 클래스 다중 상속이 안되는 이유는 상위 클래스에 겹치는 메소드가 있으면 링크 시 문제 인터페이스는 구현 자체가 안되어 있어서 문제가 없음

interface 내용은 따로 메모리에 올라가야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public interface MyInterface {

    public static final int I = 100;

    public abstract void a();

    public default void b() {
        System.out.println("b() 호출됨");
    }

    public static void c() {
        System.out.println("c() 호출됨");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class A implements MyInterface {

	@Override
    public void a() {
        System.out.println("a() 호출됨");
    }
}

public class Test {

    public static void main(String[] args) {
        A o1 = new A();
        A o2 = new A();
        A o3 = new A();

        o1.a();
        o1.b();
//      o1.c(); 
        MyInterface.c();
    }
}
  1. Test.class 파일 로드, 상속 관계 파악, Object 클래스 로드
  2. main 제외 static 로드
  3. main 수행
  4. A 클래스 로드, 상속 관계 파악, Object 클래스 로드를 이미 선행했으므로 생략
  5. A 클래스 객체의 non static member 초기화
  6. interface를 로드하며 static 키워드가 붙는 변수 혹은 메소드를 메모리에 올리고 초기화
  7. interface 상속 관계 확인 => 있다면 재귀적으로 수행
  8. default 메소드와 같은 경우 eden 영역에 추가된다.
  9. 메소드 호출
  • MyInterface가 구현되어 있기 때문에 A로드 Object로드 후 MyInterface가 확장 로드됨
  • 추상 메소드 a()는 메소드 영역에 이름만 올라간다
  • MyInterface로 바라본다면, A 클래스에 오버라이드된 MyInterface 메소드와 Object 영역에서 접근가능한 메소드는 쉐도우 이펙트로 가려지지 않지만, 나머지는 가려짐
  • static은 상속이 안됨 (객체 생성 이전에 메모리가 잡히므로)

Generic

List<A>, List<B>를 service 메소드에 넘겨줘야 할 때는 메소드를 오버로딩해서 해결하자 service(List<A> list) {} service(List<B> list) {} 컬렉션에서 타입이 확장되지 않아서.. 제네릭이 타입 캐스팅에 대해 제약이 있는 이유는 성능을 위해서다.

제네릭에선 type parameter로는 primitive가 올 수 없다. 제네릭은 사용할 대상 객체에 가장 꽉 맞는 타입을 써서 디자인하는게 제일 좋다. 박스 => 장난감이란 라벨 붙이기 (x) 헤테로지니어스 컬렉션 박스 => 팽이, 미니카, 레고 라벨 붙이기 (o) 호모지니어스 컬렉션

equals와 hashCode의 활용

set 중복 허용하지 않음. 이미 set 내에 존재하는 원소를 추가하는 동작을 방지해야함. equals, hashCode 2가지가 같으면 같다고 인식한다.

Object equals : 주소값 비교, toString : 주소값 리턴 hashCode : 주소값을 바탕으로 생성

String extends Object equals : 내용값 비교, toString() : 내용값 리턴 hashCode : 내용값을 바탕으로 생성

부가적 이야기

물리적 주소를 가리키는 논리적 주소 변수가 따로 있다. 서바이버 영역으로 옮겨가도 바뀌지 않는 논리적 주소를 통해 가리킬 수 있기 때문에

interface 내에서 자체적으로 default로 구현된 메소드로 인해 OOP 적 의미가 퇴색되었다고 할 수 있다.

jdbc : db를 쓰려면 ~가 필요해를 정의해놓은 인터페이스 이를 구현해놓은 driver가 mysql, orcale, sql server 등등

메소드가 1급 시민이 될 때 function이라 부르는데 java에는 이게 없다. 그래서 프로그래밍 단위로 메소드가 되는 경우가 없다. (class, interface)

This post is licensed under CC BY 4.0 by the author.