티스토리 뷰

Academy

[210215]인터페이스/추상클래스

VIRGIL ABLOH 2021. 2. 16. 19:25
반응형

- 학습 목표 달성 확인 목록

- [] 인터페이스를 간접적으로 구현하기 위해 추상 클래스를 활용할 수 있는가?

//결과

악셀을 밟으면 피스톤운동에 의해 엔진이 돌아간다
속도를 내기위해 악셀을 밟는다
바퀴가 굴러간다
방향을 틀기위해 핸들을 돌린다
속도를 줄이기 위해 브레이크를 밟는다

 

- [] 인터페이스를 활용할 수 있는가?

 

- [] 인터페이스의 구현을 간결하게 만들기 위해 추상 클래스를 활용할 수 있는가?

 

- [] 인터페이스의 default 메서드를 언제 활용하는가?.

인터페이스의 새로운 메서드(규칙)을 추가할 때 사용된다

기존 클래스에 영향을 주지 않고 추가할수 있다는 장점이 있다.

하지만 강제성이 없어서 인터페이스의 규칙이 무너질수 있기때문에 되도록이면 추천하지 않는다.

 

- [] 인터페이스의 활용 예를 만들 수 있는가?

--상단코드 참조--

 

- [] L10N, I18N의 약자를 기술할 수 있는가?

         !                            !

I18N-Internationalization(국제화) 앞자리와 뒷자리를 제외한 스펠링 갯수 18개

          !                 !

L10N-Localization(지역화) 앞자리와 뒷자리를 제외한 스펠링 갯수 10개

 

- [] 스태틱 중첩 클래스를 정의할 수 있는가?(참조)

앞에서 설명한 것이 있으니 참고하면 되겠다.

바깥 클래스의 인스턴스에 종속되지 않는 클래스이다.

특징으로는 top level class와 동일하게 사용한다.

 

- [] 논스태틱 중첩 클래스를 정의할 수 있는가?

바깥클래스의 인스턴스에 종속되는 클래스이다.

중첩 클래스에서 바깥 클래스의 인스턴스 멤버를 사용한다는 뜻이다.

바깥 클래스의 인스턴스 없이 작업할 수 없는 경우

중청 클래스를 non-static nested class로 정의한다.

=바깥 클래스의 인스턴스 없이 생성할 수 없다.(!=스태틱 중첩 클래스)

 

- [] inner 클래스가 무엇인지 아는가?

논스태틱 중첩 클래스와 같은 의미이다.

 

- [] 스태틱 중첩 클래스와 논스태틱 중첩 클래스의 차이를 아는가?

스태틱은 인스턴스 생성없이 클래스로 바로 접근할수 있으나

논스태틱은 인스턴스를 생성해야지만 인스턴스 멤버나 메서드를 접근할 수 있다.

public class non {
    int nonN;

    public static class X {
        static int Xa;
    }

    public class Y {
        int Ya;
    }

    public static void main(String[] args) {
        X.Xa = 10;
//         Y.Ya = 20;//인스턴스화를 하여 해당 변수에 접근할 수 있다.
        non n = new non();//먼저 바깥클래스를 인스턴스화 한다.
        n.nonN = 20;//바깥클래스의 인스턴스변수 nonN에 리터럴을 넣는다.
        non.Y nY = n.new Y();//바깥클래스.안쪽클래스 객체명 = 바깥클래스객체명.new 안쪽클래스 의 양식으로 인스턴스화 한다.
        nY.Ya = 30;
    }
}

 

- [] 로컬 클래스를 정의할 수 있는가?

메서드 안에 정의하는 클래스를 local class라고 부른다

특정 메서드 안에서만 사용되는 경우 로컬 클래스라고 정의한다

쓸데없이 외부에 노출하지 않기 위해서이다.

그만큼 노출을 줄이면 유지보수에 좋다

로컬이라는 말은 이 메서드 안에서만 사용할 수 있다는 의미이다.

그냥 사용 범위에 대한 제한을 가리키는 말이다.

메서드를 호출할 때 클래스가 정의된다는 뜻이 아니다.

class A {
  void m1() {
    class X {//로컬클래스
    }
    X obj = new X();
  }

  static void m2() {
    // 메서드 안에 정의하는 클래스를 "local class"라 한다.
    class X {//로컬클래스
    }
    X obj = new X();
  }
}

 

- [] 로컬 클래스에서 바깥 클래스 인스턴스를 주소를 어떻게 관리하는가?

로컬 클래스는 바깥 클래스의 인스턴스 주소를 저장할 필드가 있을 뿐만 아니라

인스턴스 메서드 안에 선언된 로컬 변수의 값을 저장할 필드도 있다.

.class 파일의 코드:

class com.eomcs.oop.ex11.d.D$1X {



int v3; <== 로컬 클래스의 인스턴스 필드

final synthetic com.eomcs.oop.ex11.d.D this$0; <== 바깥 클래스의 인스턴스 주소 저장

private final synthetic int val$v2; <== 바깥 메서드의 로컬 변수 저장
class D {
    int v1 = 1;

    void m1() {
        int v2 = 2;

        class X {
            int v3 = 3;

            void f() {
                int v4 = 4;
                System.out.printf("v4 = %d\n", v4);
                System.out.printf("v3 = %d\n", this.v3);
                System.out.printf("v2 = %d\n", v2);
                System.out.printf("v1 = %d\n", D.this.v1);

            }
        }
        X x = new X();
        x.f();

    }
}

public class local {
    public static void main(String[] args) {
        D d = new D();
        d.m1();
    }
}

 

- [] 로컬 클래스가 바깥 메서드의 로컬 변수를 사용할 때 어떻게 관리하는가?

클래스명과 this로 바깥 메서드또는 클래스 주소를 관리한다.

 

- [] 익명 클래스를 정의할 수 있는가?

// 익명 클래스를 정의하는 과정
// 1단계 : 로컬 클래스
/*
class X implements A {
  @Override
  public void print() {
    System.out.println("Hello!");
  }
};
 */

// 2단계 : 클래스의 이름을 지운다.
/*
class implements A {
  @Override
  public void print() {
    System.out.println("Hello!");
  }
};

=> 그러나 클래스의 이름이 없기 때문에 인스턴스를 생성할 수가 없다.
A obj = new ();
 */

// 3단계 : 클래스 이름이 없기 때문에 'class', 'implements' 키워드는 없앤다.
/*
A {
  @Override
  public void print() {
    System.out.println("Hello!");
  }
};
 */

// 4단계 : 클래스 이름이 없기 때문에 따로 인스턴스를 생성할 수 가 없다.
//       바로 생성해야 한다.
// => 인터페이스 이름 바로 앞에 'new' 키워드를 둔다.
/*
new A {
  @Override
  public void print() {
    System.out.println("Hello!");
  }
};
 */

// 5단계 : 익명 클래스의 생성자가 없기 때문에 수퍼 클래스의 생성자를 호출한다.
// => 객체 생성할 때 항상 생성자를 호출해야 하는데,
//    클래스에 이름이 없으면 생성자를 만들 수 없다.
//    따라서 호출할 익명 클래스의 생성자가 없다.
//    (실제는 내부에 익명 클래스의 기본 생성자가 만들어진다.)
//    그래서 수퍼 클래스의 생성자를 호출해야 한다.
//    자바의 모든 클래스는 따로 수퍼 클래스를 지정하지 않으면
//    java.lang.Object 클래스가 수퍼 클래스로 자동 설정된다.
//    바로 그 Object 클래스의 생성자를 호출하도록 지정해야 한다.
//    Object 클래스의 생성자는 기본 생성자 하나 뿐이다.
//    인터페이스 이름 뒤에 기본 생성자를 호출하는 괄호를 추가한다.
/*
new A() {
  @Override
  public void print() {
    System.out.println("Hello!");
  }
};
 */

// 6단계 : 익명 클래스의 레퍼런스 선언
// => 익명 클래스는 이름이 없기 때문에
//    익명 클래스로 레퍼런스를 선언할 수 없다.
//    그래서 익명 클래스가 구현한 인터페이스나
//    상속 받는 수퍼 클래스로 레퍼런스를 선언해야 한다.
/*
A obj = new A() {
  @Override
  public void print() {
    System.out.println("Hello!");
  }
};
 */

--추후 수정 예정--

 

- [] 리팩토링과 디자인 패턴의 목적이 무엇인가?

코드의 재사용

기능을 추가/변경/삭제할때 기존 코드 변경을 최소화 한다.

이렇게 되면 개발시간을 단축하고 비용절감을 할 수 있다.

 

 

반응형

'Academy' 카테고리의 다른 글

[210217]자바 API  (0) 2021.02.24
[210216]제네릭  (0) 2021.02.23
[210210]추상클래스와 인터페이스  (0) 2021.02.12
[210209]Iterator/추상클래스/인터페이스  (0) 2021.02.11
[210208]접근제어자/오버라이딩  (0) 2021.02.09
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2026/06   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함