Dreaming Dean
Hello, I'm Studying
  • Secure
  • Java
  • Oracle
  • +others
Coding.
I AM STUDYING PROGRAMING LANGUAGE. IF YOU WANT TO SEE MY WORK THE PROGRAMMING PROJECT, CHECK IT OUT MY BLOG AND GITHUB.

Extends 상속

Dean92
2017. 5. 26. 11:06

상속

 상속은 기존의 클래스를 재사용 해서 새로운 클래스를 작성하는 과정이다. 쉽게 말해서 부모 클래스를 상속extends받아 자식 클래스에서 부모 코드를 재사용 할 수 있는 것이다. 프로그램을 설계하다보면, 공통된 부분으로 인하여 중복되는 코드들이 계속 나올 수 있다. 이때 상속을 사용하여, 비슷한 객체끼리 하나의 묶음으로 묶어주고, 공통된 부분을 상위 개념의 부모 클래스로 생성하게 되고 이 객체들이 부모 객체를 상속하면 중복된 코드들을 줄일 수 있고 공통된 방식으로 프로그램을 설계할 수 있다.

class 자손클래스 extends 조상클래스 {
	// ...
}

class Point{
	int x;
	int y;
}

//class Point3D{
//	int x;
//	int y;
//	int z;
//}
//▼상속받아서 사용
class Point3D extends Point {
	int z;
}


상속의 의의
객체지향 이론은 코드 재활용의 관점에서 적합하지 않은 이론이다.
Java의 상속Extends은 클래스의 재활용적 측면에서만 바라보는 것은 문제가 있다.
재활용 할 수 있다는 이유만으로 상속을 하는 경우는 거의 없다.
상속을 사용하는 이유
연관된 일련의 클래스에 대한 공통적인 규약을 정의하고 적용하기 위해 상속을 사용한다.
재활용을 고려해서 클래스를 디자인 할 경우, 설계에 필요한 시간이 더욱 길어지므로 상속을 활용한다.
실무에서 여러 프로그래머가 동시에 같은 프로젝트를 코딩할 때 통일성을 갖출 수 있다.


클래스간의 관계

상속관계Inheritance

 두 클래스가 조상과 자손으로써 관계를 가지게 되면 상속 관계에 있다고 한다. 상속 관계의 특징은 아래와 같다.

공통부분은 조상에서 관리하고 개별부분은 자손에서 관리한다.
공통부분은 조상에서 관리하고 개별부분은 자손에서 관리한다.
class Parent { }
class Child extends Parent { }
class Child2 extends Parent { }
class GreandChild extends childe { }


포함관계Composite

 포함이란 한 클래스의 멤버변수로 다른 클래스를 선언하는 것을 말한다. 포함관계는 작은 단위의 클래스를 먼저 만들고, 이 들을 조합해서 하나의 커다란 클래스를 만든다.


상속관계

  • 상속관계에 있는 두 클래스 사이에는 IS-A관계가 성립해야 한다.
  • IS-A 관계가 성립하지 않는 경우에는 상속의 타당성을 면밀히 검토해야 한다.
  • IS-A 이외에 HAS-A관계도 상속으로 표현 가능하다. 그러나 HAS-A를 대신해서 IS-A관계를 유지하는 것이 보다 적절한 경우가 많다

  • IS-A 관계

    말 그대로 IS-A관계는 "~는 ~이다."가 성립되는 관계이다.

    class Computer {
    	String owner;
    	public Computer(String name) { }
    	public void calculate() { }
    }
    
    부모클래스
    class NotebookComputer extends Computer {
    	int battary;
    	public NotebookComputer(String name, int initChag) {
    		super(name);
    	}
    	public void charging() { }
    	public void movingCal() { }
    }
    
    노트북 컴퓨터 이다.
    class TabletNotebook extends NotebookComputer {
    	String regstPenModel;
    	public TabletNotebook(String name, int initChag) {
    		super(name, initChag);
    	}
    	public void write(String penInfo) { }
    }
    
    타블렛 노트북 이다.


    HAS-A 관계

    클래스 내에 다른 클래스를 "포함" 함으로써 기능적인 것을 사용하고자 했을 때 HAS-A 관계를 이용한다.

    class Gun {
    	int bullet;	//장전된 총알의 수
    	public Gun(int bnum) { bullet=bnum; }
    	public void shut(){
    		System.out.println("BANG@@");
    		bullet--;
    	}
    }
    
    class Police extends Gun {
    	int handcuffs;	//소유한 수갑의 수
    	public Police(int bnum, int bcuff) {
    		super(bnum);
    		handcuffs=bcuff;
    	}
    	public void putHandcuff(){
    		System.out.println("SNAP!");
    		handcuffs--;
    	}
    }
    
    경찰은 총 소유하고 있다.
    상속은 강한 연결고리를 형성한다. 때문에 총을 소유하지 않는 경찰 또는 총이 아닌 경찰봉을 소유하는 경찰 등 다양한 표현에 한계를 보인다는 단점이 있다.


    단일상속Single Inheritance관계
    Java는 단일상속만을 허용한다. (C++은 다중상속 허용한다.)
    class Police extends Gun, Handcuffs {      //이와같은 다중상속을 허용하지 않는다.
    ...
    }
    
    비중이 높은 클래스 하나만 상속관계로, 나머지는 포함관계로 한다.


    Object클래스

    Object클래스는 모든 클래스의 최고 조상으로 자바 클래스가 아무것도 상속하지 않으면 java.lang 패키지의 Object 클래스를 자동으로 상속한다. 때문에 모든 자바 클래스는 Object 클래스를 직접적 혹은 간접적으로 상속하게 된다.

    모든 클래스가 Object 클래스를 직접 혹은 간접적으로 상속하므로 다음 두가지가 가능하다.
  • 자바의 모든 인스턴스는 Object 클래스의 참조변수로 참조 가능하다.
  • 자바의 모든 인스턴스를 대상으로 Object 클래스에 정의된 메소드를 호출 가능 하다.
  • 모든 클래스가 Object 클래스를 상속한다는 것과 관련된 것
  • Object클래스에는 toString 메소드가 다음의 형태로 정의되어 있다.
  • public String toString() { … }
  • Println 메소드는 다음과 같이 정의되어 있다.
  • public void println(Object x) { … }
  • 모든 인스턴스는 println 메소드의 인자로 전달될 수 있다.
  • 인자로 전달되면 toString 메소드가 호출되고 이 때 반환되는 문자열이 출력된다.
  • toString 메소드는 적절한 문자열 정보를 반환하도록 오버라이딩 해야 한다.
  • 예제

    • Code


      StringTest.java
      public class StringTest {
      	public static void main(String[] args) {
      //		==는 객체의 참조값 비교, Object 클래스의 equals()도 참조값비교
      //		String 클래의 equals()는 오버라이딩 되어있음->문자열 내용비교				
      		String aa = "aa";
      		String bb = "aa";
      		String cc = new String("aa");
      		String dd= bb;
      		System.out.println(aa.equals(bb));
      		System.out.println(aa.equals(cc));
      		System.out.println(aa==bb);
      		System.out.println(bb==cc);
      		System.out.println(aa==cc);
      		System.out.println(dd==bb);
      		System.out.println(dd.equals(cc));
      	}
      }
      
    • Result





    Comments