상속

: 클래스는 다르지만 소스코드가 비슷한 내용이 많을 경우 상속하여 사용함 

 

부모클래스  ---->  자식클래스 (멤버변수, 메서드 물려받음)

(super class)         (sub class) 

 

형식) 자식클래스명 extends 부모클래스명(같은 패키지에 있으면 패키지명 생략)

 

상속의 장점

1. 기존의 부모클래스의 멤버변수, 메서드를 사용할 수 있어 소스코드를 재사용할 수 있다 

2. 코딩양이 줄어들고 개발시간이 단축된다

 

상속의 특징

1. 부모의 생성자는 상속불가하다(구조적인 문제때문에)

2. private로 선언된 멤버변수와 메서드는 상속불가하다

3. 다중상속이 불가하다(동시에 한개 이상의 부모로부터 상속금지) => (순차적으로)단일상속만 지원

class Child extends Father, Mother (x)

class Child extends Fatehr

class Child extends Mother    (o) 

4. 누적하여 기능이 많아진다(멤버변수, 메서드의 갯수가 증가) 

 

상속의 단점

부모로부터 물려받은 메서드를 자식입장에서 그대로 사용하게 될 경우 문제가 발생할 수 있다

=> 오버라이딩

부모로부터 물려받은 메서드를 자식클래스에 맞게 내용을 수정하는 것 

 

************

오버로딩

한 클래스에서 비슷한 기능을 가진 여러개의 메서드가 있을때 유지보수측면에서 편리성을 추구하기 위해

메서드의 이름은 통일시키고 매개변수의 갯수나 자료형을 다르게 줌으로써 다른 메서드처럼 구분하여 호출해주는 기법 

************

 


*** 클래스들간의 관계 설정 (논리적인 관계)***

1. is a 관계 

class Manager extends Employee{}

매니저는 그 회사의 직원이다(is a 관계 성립)

 

2. has a 관계 

포함관계 => 두 클래스 사이를 연결시키는 방법(멤버변수를 선언-> 연결)포함시킨다는 말의 의미

-> manager입장에서 employee가 가지고 있는 멤버변수, 메서드가 필요

 

=> 1의 경우 강제성을 띠지만 2번의 경우 강제성을 띠지 않는다(선택 가능)

결합도의 측면에서 봤을때 1번의 경우 결합력이 강하고, 2번의 경우 결합력이 약하다고 할 수 있다

 


상속과 생성자의 관계 

상속관계에서 자식클래스의 객체를 생성

-> 부모클래스의 생성자를 먼저 호출하고 나서 자식클래스의 생성자를 호출한다

this : 자식 클래스의 객체를 가리키는 예약어
this(): 자식클래스의 생성자를 호출하라는 문장
super : 부모클래스의 객체를 가리키는 예약어
super() : 부모클래스의 생성자를 호출하라는 문장(기본생성자이므로 생략 가능) 

 

class Parent{ 
	public Parent() {
		System.out.println("Parent 기본 생성자");
	}
}
class Child extends Parent{
	public Child() {
		System.out.println("Childe 기본 생성자");
	}
}

public class InheriTest{

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Child c =new Child();
	}
}
/*
Parent 기본 생성자
Childe 기본 생성자
*/

<Parent 클래스 객체 생성과 생성자와의 관계>

package j210112;
//모든 클래스는 오브젝트를 상속받고 있다
import java.lang.Object;

class Parent extends Object{ //<3> Object 생성자 호출
	public Parent() {
		//super(); // 생략되어있음 <2>
		//object에 커서 두고 shift + f2 누르기-> object클래스 보여줌
		System.out.println("Parent 기본 생성자");//<4>
	}
}
//class Child extends Object{} //순차적으로 받게 되어있음
class Child extends Parent{
	public Child() {
		System.out.println("Childe 기본 생성자");
	}
}

public class InheriTest extends Object{
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Parent p = new Parent(); //<1>
	}
}
/*
Parent 기본 생성자
*/

Parent 클래스 객체를 생성하면 생략되어 있던 super(); 가 실행되면서 부모클래스의 생성자를 먼저 호출하는데 

이때 Object 클래스의 생성자는 내용이 없으므로 보이지 않을뿐, 항상 부모클래스 생성자를 먼저 호출한다

 

 

 

<Child 클래스 객체 생성과 생성자와의 관계>

package j210112;
//모든 클래스는 오브젝트를 상속받고 있다
import java.lang.Object;

class Parent extends Object{ //<4>Object 생성자 호출
	public Parent() {
		//super();//생략되어있음<3>
		//object에 커서 두고 shift + f2 누르기-> object클래스 보여줌
		System.out.println("Parent 기본 생성자");<5>
	}
}
//class Child extends Object{} //순차적으로 받게 되어있음
class Child extends Parent{
	public Child() {
    	//super();//생략되어있음<2>
		System.out.println("Childe 기본 생성자");//<6>
	}
}

public class InheriTest extends Object{
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Child c =new Child();//<1>
	}
}
/*
Parent 기본 생성자
*/

 


toString() 

Object클래스의 메서드로 그 객체를 대표하는 문자열(주소값)을 반환한다

getClass().getName() + '@' + Integer.toHexString(hashCode())

객체와 연관이 있는 클래스명 @ 16진수문자열  (메모리 주소값)  => 주소값

 

class Parent extends Object{ 
	public Parent() {
		//super();//생략되어있음
		System.out.println("Parent 기본 생성자");
	}
}
class Child extends Parent{
	public Child() {
		System.out.println("Childe 기본 생성자");
	}
}

public class InheriTest extends Object{
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Parent p = new Parent(); //(1)
		System.out.println("p=>"+p);
		System.out.println("p.toString()=>"+p.toString());
		//.toString()가 생략되어 있음
		
		Child c =new Child();
		System.out.println("c=>"+c);
		System.out.println("c.toString()=>"+c.toString());
	}
}
/*
Parent 기본 생성자
p=>j210112.Parent@15db9742
p.toString()=>j210112.Parent@15db9742
------------------------------------
Parent 기본 생성자
Childe 기본 생성자
c=>j210112.Child@6d06d69c
c.toString()=>j210112.Child@6d06d69c
*/

 

toString Override

class Parent extends Object{ 
	public Parent() {
		//super();//생략되어있음
		System.out.println("Parent 기본 생성자");
	}
    //ctrl+ space -> 제시조건등을 띄어줌
	//부모클래스의 메서드가 오버라이딩되면 자식클래스의 객체에도 반영된다
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "내용 변경";
	}
}
class Child extends Parent{
	public Child() {
		System.out.println("Childe 기본 생성자");
	}
}

public class InheriTest extends Object{
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Parent p = new Parent(); //(1)
		System.out.println("p=>"+p);
		System.out.println("p.toString()=>"+p.toString());
		//자동으로 toString()이 붙으므로 주소가 출력되다
		
		Child c =new Child();
		System.out.println("c=>"+c);
		System.out.println("c.toString()=>"+c.toString());
	}
}
/*
Parent 기본 생성자
p=>내용 변경
p.toString()=>내용 변경
------------------------------------
Parent 기본 생성자
Childe 기본 생성자
c=>내용 변경
c.toString()=>내용 변경
*/

 

 


상속관계에 있는 클래스의 생성자를 호출할때 매개변수와 상관없이 super()가 생략되어 있다

public class SuperTest {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//C클래스의 객체 c를 생성하면서 문자열처리 인수1개짜리 생성자를 호출하라
		C c=new C("홍길동");//<1>
	}
}

class A{
	public A() {
		//super();//<4>Object클래스의 생성자 호출
		System.out.println("A의 기본 생성자");//<5>
	}
}
class B extends A{
	public B() {
		//super();//<3>
		System.out.println("B의 기본 생성자");//<6>
	}
}

class C extends B{
	public C() {
		System.out.println("C의 기본 생성자");
	}
	public C(String s) {
		//super(); //<2>
		System.out.println(s);//<7>
	}
}
/*
A의 기본 생성자
B의 기본 생성자
홍길동
*/

 

* 부모클래스의 매개변수 있는 생성자는 자동으로 호출할 수 없다 

반드시 부모클래스의 내부에서 매개변수 있는 생성자를 먼저 작성해줘야 호출이 가능하다

+ Recent posts