on
Java 상속, 클래스들의 관계
Java 상속, 클래스들의 관계
클래스들의 관계
- has a 관계 : 한 객체가 다른객체를 포함한 관계
- 집합관계 : 전체와 부분의 수명이 다른 경우에 해당됨 ex) 자동차 has a 라디오...
- 구성관계 : 전체와 부분의 수명이 같은 경우 ex) 자동차 has a 엔진...
→ Car 클래스내에서 인스턴스 변수로 Engine 클래스, Radio 클래스 등등을 선언함으로써 관계표현 할 수 있음
- is a 관계 : 객체간의 유사한 개념이 있는 관계
- 유사개념을 추출해 상위개념의 객체로 만들 수 있으면 상속기법을 적용할 수 있다.
ex) 엔지니어 클래스, 관리자 클래스, 회계 클래스... → 직원이라는 공통 속성을 뽑아 직원 클래스를 만들어 관리가능
- 이때, 상위객체인 직원클래스를 부모클래스 / 하위객체인 클래스를 자식클래스라고 함.
상속
- 객체 간에 is a 관계가 성립되어야 함
- 부모클래스의 인스턴스, 메서드를 자식클래스가 선언 없이 사용 가능, private상속 불가
- 부모클래스는 여러 자식클래스를 가질 수 있지만, 자식클래스는 하나의 부모 클래스만 가질 수 있다 / 단일상속만지원
- 자동적으로, Object가 최상위 클래스
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 //부모클래스 public class Employee { String name; //객체들간의 공통된 속성을 뽑아낸 공통멤버변수 int salary; //객체들간의 공통된 속성을 뽑아낸 공통멤버변수 public String getEmployee() { return name + "\t" + salary; } public Employee() { //부모클래스의 기본생성자를 먼저 생성해야함 super (); System . out . println ( "Employee기본생자호출 =============" ); } public Employee( String name, int salary) { super (); this .name = name; this .salary = salary; } } /////////////////////////////////////////////////////////////// //자식클래스 public class Manager extends Employee{ //extends 부모클래스명 문법으로 상속함 String depart; // 기본생성자를 위해 public String getManager() { return name + "\t" + salary + "\t" + depart; //부모클래스의 인스턴스를 자식클래스는 자유롭게 사용가능 !! } public Manager() { //부모의 기본생성자 호출 부모객체 먼저 생성 (반드시 기본생성자여야함) super (); System . out . println ( "Manager 기본생성자 호출됨 ===============" ); } } /////////////////////////////////////////////////////////////////// public class Test { public static void main( String [] args) { Manager m = new Manager(); //매니저객체생성(기본생성자) m.name = "홍길동" ; //부모클래스에 있는 인스턴스지만 상속하면 자식클래스만 객체생성해도 사용가능 m.salary = 100 ; //부모클래스에 있는 인스턴스 m.depart = "연구" ; System . out . println (m.getEmployee()); //부모클래스의 함수를 자유롭게 사용 System . out . println (m.getManager()); // Manager k = new Manager("이순신",200,"영업"); //매니저클래스에 이런 생성자없다고 오류발생 } } Colored by Color Scripter cs
위 코드 Test클래스 실행결과
- Test클래스에서 Manager클래스 객체를 생성할때 부모클래스인 Employee기본생성자먼저 호출해서 생성됨.
- m.name, m.salary, m.depart모두 자식클래스를 참조변수로 하지만 상속했기 떄문에 부모클래스의
name, salary인스턴스 사용가능
- 부모클래스의 기본생성자를 반드시 생성해야함
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 31 32 33 34 35 36 37 38 39 40 41 42 43 class Employee{ //부모클래스 String name; int salary; public String getEmployee() { return name + " " + salary; } public Employee() { super (); } public Employee( String name, int salary) { super (); this .name = name; this .salary = salary; } } ////////////////////////////////////////////////// class Manager extends Employee{ //자식클래스 String depart; public String getManager() { return name + "\t" + salary + "\t" + depart; } public Manager( String name, int salary, String depart) { super (); this .name = name; this .salary = salary; this .depart = depart; } } public class Ex06_1 { public static void main( String [] args) { Employee emp = new Employee( "홍길동" , 2000 ); Manager man = new Manager( "이순신" , 4000 , "개발" ); System .err. println (emp.getEmployee()); //빨간색 글씨로 출력(syserr) System .err. println (man.getManager()); //빨간색 글씨로 출력(syserr) } } /////////////////////////실행결과///////////////////////////////////// 홍길동 2000 이순신 4000 개발 Colored by Color Scripter cs
상속과 생성자
- 부모클래스의 생성자는 자식 클래스에게 상속되지 않는다.
- 객체생성시 자동으로 부모클래스를 먼저 객체생성 후에 자식의 클래스가 생성된다.
- 부모가 먼저 생성되어야 부모가 가지고 있는 멤버변수, 메서드를 사용할 수 있기 때문
- 자식 클래스의 생성자 첫 라인에서 부모 생성자 호출이 자동으로 발생됨
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 class Emp{ //부모클래스 public Emp() { //부모클래스의 기본생성자 System .err. println ( "emp생성자1" ); //3번 } public Emp( String name, int salary) { System .err. println ( "emp생성자2" ); } } class Man extends Emp{ public Man() { //2 System .err. println ( "Man생성자1" ); } } public class Ex06_2 { public static void main( String [] args) { Man man = new Man(); //1 } } /////////////////////////실행결과///////////////////////////////////// emp생성자1 Man생성자1 Colored by Color Scripter cs
- //1이 실행되고 //2로 가게되면 자동으로 //3 으로가서 부모클래스의 기본생성자가 먼저 호출이 됨
Super 키워드
- 상속관계의 하위클래스에서 상위클래스의 구성요소를 명시적으로 호출할 때 사용
- 어처피 상속받기 때문에 하위클래스에서 상위클래스의 멤버를 사용할 수 있으나 다음의 2가지 경우, 명시적호출
1) 부모클래스의 멤버와 자식클래스의 멤버가 이름이 동일한 경우
1 2 3 4 5 6 7 8 9 class Emp{ //부모클래스 int age = 20 ; } class Man extends Emp{ //자식클래스 int age = 40 ; ~~ ~~age //자식클래스의 40을 의미 ~~ super .age // 부모클래스의 20을 의미 } cs
2) 자식클래스에서 명시적으로 부모생성자를 호출하는 경우
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 31 32 33 34 35 36 37 38 39 package com.test2; class Employee{ String name; int salary; public String getEmployee() { return name + "\t" + salary; } public Employee( String name, int salary) { super (); this .name = name; this .salary = salary; } public Employee() { super (); } } class Manager extends Employee{ String depart; public String getManger() { return super .getEmployee() + "\t" + depart; } //super키워드를 통해 부모클래스의 getEmployee메소드를 명시적으로 호출한다. public Manager( String name, int salary, String depart) { super (name, salary); //super키워드를 통해 부모클래스의 생성자를 명시적으로 호출한다. this .depart = depart; } } public class Ex06_3 { public static void main( String [] args) { Employee emp = new Employee( "홍길동" , 200 ); Manager man = new Manager( "이순신" , 100 , "개발" ); System . out . println (man.getEmployee()); //이순신 100 출력 System . out . println (man.getManger()); //이순신 100 개발 출력 } } Colored by Color Scripter cs
name, salary변수가 Employee에서 생성된 변수이기떄문에 그곳에서 초기화해준다. 그 결과를 다시 get에서 받아서 사용
접근지정자
- 잘못된 데이터의 저장을 방지하거나 보안을 위해서 외부 클래스에서의 접근을 제어
- public / protected / (dafault) / private : 상속관계에서 접근 불가(get함수를 통해서만 반출)
- private을 통해 클래스.변수명 = 값 이런식의 접근을 못하게 막을 수있음
- private을 통해 메서드 및 생성자를 통해 검증 작업을 거친후 데이터를 저장 및 관리하는 방법을 이용할 수 있음
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 31 32 33 34 35 36 package com.test3; class Super{ public int num1 = 10 ; //같은 클래스 가능, 같은 패키지 가능, 상속관계 가능, 다른패키지 가능 protected int num2 = 20 ; //같은 클래스 가능, 같은 패키지 가능, 상속관계 가능, 다른패키지 불가 int num3 = 30 ; //같은 클래스 가능, 같은 패키지 가능, 상속관계 불가, 다른패키지 불가 private int num4 = 40 ; //같은 클래스 가능, 같은 패키지 불가, 상속관계 불가, 다른패키지 불가 public int getNum4() { return num4; } } class Sub extends Super{ private int num5; public void print () { System . out . println (num1); System . out . println (num2); System . out . println (num3); // System.out.println(num4);//private으로 걸려있어서 오류발생 System . out . println (getNum4()); //상속해서 부모클래스메서드 바로 사용가능 System . out . println (num5); } } public class Ex06_4 { public static void main( String [] args) { Sub sub = new Sub(); sub. print (); } } ////////////실행결과///////////////////// 10 20 30 40 0 Colored by Color Scripter cs
from http://cocoshin.tistory.com/18 by ccl(A) rewrite - 2021-11-19 00:27:13