Java 객체지향 개념 정리III

5 분 소요

객체지향개념

추상클래스

1. 추상클래스(abstract class)란?

  • 클래스가 설계도라면 추상클래스는 ‘미완성 설계도’
  • 추상메서드(미완성 메서드)를 포함하고 있는 클래스
  • 추상메서드: 선언부만 있고 구현부(몸통, body)가 없는 메서드
      abstract class Player{
          int currentPos;  //현재 play되고 있는 위치를 저장하기 위한 변수
          Player(){
              currentPos = 0;
          }
          abstract void play(int pos); //추상메서드
          abstract void stop();  //추상메서드
    
          void play(){
              play(currentPos);  //추상메서드를 사용할 수 있다.
          }
      }
    
  • 일반메서드가 추상메서드를 호출할 수 있다. (호출할 때 필요한 건 선언부)
  • 완성된 설계도가 아니므로 인스턴스를 생성할 수 없다.
  • 다른 클래스를 작성하는데 도움을 줄 목적으로 작성된다.

2. 추상메서드(abstract method)란?

  • 선언부만 있고 구현부(몸통, body)가 없는 메서드
      abstract 리턴타입 메서드이름();
      /* 지정된 위치(pos)에서 재생을 시작하는 기능이 수행되도록 작성한다 */
      abstract void play(int pos);
    
  • 꼭 필요하지만 자손마다 다르게 구현될 것으로 예상되는 경우에 사용
  • 추상클래스를 상속받은 자손클래스에서 추상메서드의 구현부를 완성한다.
      abstract class Player{
          abstract void play(int pos);  //추상메서드
          abstract void stop();  //추상메서드
    
      }
      class AudioPlayer extends Player{
          void play(int pos){}
          void stop(){}
      }
      abstract class AbstractPlayer extends Player{
          void play(int pos){}
      }
    

3. 추상클래스의 작성

  • 여러 클래스에 공통적으로 사용될 수 있는 추상클래스를 바로 작성하거나 기존클래스의 공통 부분을 뽑아서 추상클래스를 만든다.

인터페이스

1. 인터페이스(interface)란?

  • 일종의 추상클래스. 추상클래스(미완성 설계도)보다 추상화 정도가 높다.
  • 실제 구현된 것이 전혀 없는 기본 설계도. (알맹이 없는 껍데기)
  • 추상메서드와 상수만을 멤버로 가질 수 있다.
  • 인스턴스를 생성할 수 없고, 클래스 작성에 도움을 줄 목적으로 사용된다.
  • 미리 정해진 규칙에 맞게 구현하도록 표준을 제시하는 데 사용된다.

2. 인터페이스의 작성

  • ‘class’대신 ‘interface’를 사용한다는 것 외에는 클래스 작성과 동일하다.
      interface 인터페이스이름{
          public static final 타입 상수이름 = ;
          public abstract 메서드이름(매개변수목록);
      }
    
  • 하지만, 구성요소(멤버)는 추상메서드와 상수만 가능하다.
    • 모든 멤버변수는 public static final 이어야 하며, 이를 생략할 수 있다.
    • 모든 메서드는 public abstract 이어야 하며, 이를 생략할 수 있다.
      interface PlayingCard{
          public static final int SPADE = 4;
          final int DIAMOND =3; 
          static int HEART = 2;
          int CLOVER = 1;
      
          public abstract String getCardNumber();
          String getCardKind(); 
      }
      

3. 인터페이스의 상속

  • 인터페이스도 클래스처럼 상속이 가능하다. (클래스와 달리 다중상속 허용)
      interface Movable{
          /**지정된 위치 (x,y)로 이동하는 기능의 메서드 */
          void move(int x, int y);
      }
      interface Attackable{
          /**지정된 대상(u)를 공격하는 기능의 메서드 */
          void attack(Uint u;)
      }
      interface Fightable extends Movable, Attackable{}
    
  • 인터페이스는 Object클래스와 같은 최고 조상이 없다.

4. 인터페이스의 구현

  • 인터페이스를 구현하는 것은 클래스를 상속받는 것과 같다. 다만 ‘extends’ 대신 ‘implements’를 사용한다.
      class 클래스이름 implements 인터페이스이름{
          //인터페이스에 정의된 추상케서드를 구현해야한다.
      }
    
  • 인터페이스에 정의된 추상메서드를 완성해야 한다.
      class Fighter implements Fightable{
          public void move(int x, int y){}
          public void attack(){}
      }
      interace Fightable{
          void move(int x, int y);
          void attack(Unit u);
      }
    
  • 상속과 구현이 동시에 가능하다
      class Fighter extends Unit implements Fightable{
          publid void move(int x, int y){}
          public void attack(Unit u){} 
      }
    

5. 인터페이스를 이용한 다형성

  • 인터페이스 타입의 변수로 인터페이스를 구현한 클래스의 인스턴스를 참조할 수 있다.
      class Fighter extends Unit implements Fightable{
          public void move(int x, int y){}
          public void attack(Fightable f){}
      }
    
  • 인터페이스를 메서드의 매개변수 타입으로 지정할 수 있다.
      void attack(Fightable f){
          // Fightable인터페이스를 구현한 클래스의 인스턴스를 매개변수로 받는 메서드
      }
    
  • 인터페이스를 메서드의 리턴타입으로 지정할 수 있다.
      Fightable method(){
          //Fightable인터페이스를 구현한 클래스의 인스턴스를 반환
          return new Fighter();
      }
    

    6. 인터페이스의 장점

1. 개발시간을 단축시킬 수 있다.

  • 인터페이스가 작성되면, 이를 사용해서 프로그램을 작성하는 것이 가능하다. 메서드를 호출하는 쪽에서는 선언부만 알면 되기 때문이다.
  • 동시에 다른 한 쪽에서는 인터페이스를 구현하는 클래스를 작성하도록 하여, 인터페이스를 구현하는 클래스가 작성될 때까지 기다리지 않고 양쪽에서 동시에 개발을 진행할 수 있다.

2. 표준화가 가능하다.

  • 프로젝트에 사용되는 기본 틀을 인터페이스로 작성한 다음, 개발자들에게 인터페이스를 구현하여 프로그램을 작성하도록 함으로써 보다 일관되고 정형화된 프로그램의 개발이 가능하다.

3. 서로 관게없는 클래스들에게 관계를 맺어줄 수 있다.

  • 서로 상속관계에 있지도 않고, 같은 조상클래스를 가지고 있지 않은 서로 아무런 관계도 없는 클래스들에게 하나의 인터페이스를 공통적으로 구현하도록 함으로써 관계를 맺어 줄 수 있다.

4. 독립적인 프로그래밍이 가능하다.

  • 인터페이스를 이용하면 클래스의 선언과 구현을 분리시킬 수 있기 때문에 실제구현에 독립적인 프로그램을 작성하는 것이 가능하다.
  • 클래스와 클래스간의 직접적인 관계를 인터페이스를 이용해서 간접적인 관계로 변경하면, 한 클래스의 변경이 관련된 다른 클래스에 영향을 미치지 않는 독립적인 프로그래밍이 가능하다.

7. 인터페이스의 이해

  • 두 대상(겍체) 간의 ‘연결, 대화, 소통’을 돕는 ‘중간 역할’을 한다.
  • 선언(설계)와 구현을 분리시키는 것을 가능하게 한다.
      class B{
          public void method(){
              System.out.println("methodInB");
          }
      }
    
      interface I{
          public void method();
      }
      class B implements I{
          public void method(){
              System.out.println("methodInB");
          }
      }
    
  • 인터페이스를 이해하려면 먼저 두 가지를 기억하자
    • 클래스를 사용하는 쪽(User)과 클래스를 제공하는 쪽(Provider)이 있다.
    • 메서드를 사용(호출)하는 쪽(User)에서는 사용하려는 메서드(Provider)의 선언부만 알면 된다. 인터페이스

8. 디폴트 메서드(default method) -JDK1.8

  • 인터페이스에 새로운 메서드(추상 메서드)를 추가하면? 이 인터페이스를 구현한 기존의 모든 클래스가 이 메서드를 구현해야 함
  • 이 문제를 해결하기 위해 ‘디폴트 메서드’를 고안
  • 디폴트 메서드는 추상 메서드의 기본 구현을 제공한다. 그래서 몸통{}을 가지고 있으며, 앞에 ‘default’를 붙이고 항상 public 이다. (생략 가능)
      interface MyInterface{
          void method();
          default void newMethod(){}
      }
    
  • 여러 인터페이스의 디폴트 메서드 간의 충돌
    • 인터페이스를 구현한 클래스에서 디폴트 메서드를 오버라이딩해야 한다.
  • 디폴트 메서드와 조상 클래스의 메서드 간의 충돌
    • 조상 클래스의 메서드가 상속되고, 디폴트 메서드는 무시된다.

내부 클래스(inner class)

1. 내부 클래스란?

  • 클래스 안에 선언된 클래스
  • 특정 클래스 내에서만 주로 사용되는 클래스를 내부 클래스로 선언한다.
  • GUI어플리케이션(AWT, Swing)의 이벤트처리에 많이 사용된다.
  • 내부 클래스의 장점
    • 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있다.
    • 코드의 복잡성을 줄일 수 있다. (캡슐화)

2. 내부 클래스의 종류와 특징

  • 내부 클래스의 종류는 변수의 선언위치에 따른 종류와 동일하다.
  • 유효범위와 성질도 변수와 유사하므로 비교해보면 이해하기 쉽다.
  • 인스턴스 클래스(instance class)
    • 외부 클래스의 멤버변수 선언위치에 선언하며, 외부 클래스의 인스턴스 멤버처럼 다루어진다. 주로 외부 클래스의 인스턴스멤버들과 관련된 작업에 사용될 목적으로 선언된다.
  • 스테틱 클래스(static class)
    • 외부 클래스의 멤버변수 선언위치에 선언하며, 외부 클래스의 static멤버처럼 다루어진다. 주로 외부 클래스의 static멤버, 특히 static메서드에서 사용될 목적으로 선언된다.
  • 지역 클래스(local class)
    • 외부 클래스의 메서드나 초기화블럭 안에 선언하며, 선언된 영역 내부에서만 사용될 수 있다.
  • 익명 클래스(annonymous class)
    • 클래스의 선언과 객체의 생성을 동시에 하는 이름없는 클래스 (일회용)

3. 내부 클래스의 제어자와 접근성

  • 내부 클래스의 접근제어자는 변수에 사용할 수 있는 접근제어자와 동일하다.
  • static클래스만 static멤버를 정의할 수 있다.
  • 내부 클래스도 외부 클래스의 멤버로 간주되며, 동일한 접근성을 갖는다.
  • 외부 클래스의 지역변수는 final이 붙은 변수(상수)만 접근가능하다. 지역 클래스의 인스턴스가 소멸된 지역변수를 참조할 수 있기 때문이다.
      class Outer{
          private int outerIv = 0;
          static int outerCv = 0;
    
          class InstanceInner{
              int iiv = outerIv; //외부클래스의 private멤버도 접근가능하다.
              int iiv2 = outerCv;
          }
          static class StaticInner{
              //static클래스는 외부 클래스의 인스턴스멤버에 접근할 수 없다.
              // int siv = outerIv;
              static int scv = outerCV;
          }
          void myMethd(){
              int lv = 0;
              final int LV = 0 ; //JDK 1.8부터 final 생략 가능
    
              class LocalInner{
                  int liv = outerIv;
                  int liv2 = outerCv;
                  //외부 클래스의 지역변수는 final이 붙은 변수만 접근가능하다.
                  //int ilv3 = lv; //에러 (JDK 1.8부터 에러 아님)
                  int liv4 = LV;   //OK
              }
          }
      }
    
      class outer{
          int value = 10;  //Outer.this.value
    
          class Inner{
              int value = 20; //this.value
              void method(){
                  int value = 30;  //value
              }
          }
      }
      class InnerEx5{
          public static void main(String args[]){
              Outer outer = new Outer();
              Outer.Inner inner = outer.new Inner();
              inner.method1();
          }
      }
    

    4. 익명 클래스(annoymous class)

  • 이름이 없는 일회용 클래스. 선언과 생성을 동시에. 하나의 객체만 생성가능
    new 조상클래스이름(){
        //멤버선언
    } 
    또는
      
    new 구현인터페이스이름(){
        //멤버선언
    }
    
    Ex)  
    class InnerEx6{
        Object iv = new Object(){ void method(){}}; //익명클래스
        static Object cv = new Object(){void method(){}}; //익명클래스
    
        void myMethd(){
            Object Iv = new Object(){ void method(){}}; //액명클래스
        }
    }
    

태그: ,

카테고리:

업데이트: