-
클래스 상속, override프로그래밍/JAVA 자바 2021. 7. 22.반응형
package ex0722; public class Ex01_Inheritance { public static void main(String[] args) { // 클래스 상속 Sample1 s = new Sample1(); System.out.println(s.c); // 상위 클래스 칠드 접근 s.print(); s.disp(); } } //상속은 주로 검증된 것들을 상속 받기위해 사용한다. class Test1 { //상위 클래스는 Object private int a = 10; // 하위 클래스 접근 불가능 int b = 20; // 동일한 패키지 에서만 접근 가능 protected int c = 30; // 동일한 패키지 및 하위 클래스는 어디서나 접근 가능 public int d = 40; // 모두 접근 가능 public void print() { System.out.println(a+":"+b+":"+c+":"+d); } } class Sample1 extends Test1 { //Test1 클래스 물려받기 int x = 10; public void disp() { //System.out.println(a); //컴파일 오류 상위 클래스의 private는 접근 불가능 System.out.println("상위 클래스에서 물려받은 필드 변수 : "+b+","+c+","+d); } }
package ex0722; public class Ex02_Inheritance { public static void main(String[] args) { // TODO Auto-generated method stub Sample2 ss = new Sample2(); ss.disp(); } } class Test2 { int a=10; int b=20; public void print() { System.out.println(a+":"+b); } } class Sample2 extends Test2 { int b=100; int x=200; int y=300; public void disp() { int x=50; System.out.println("a:"+a); // 10 나옴 super 클래스의 a필드 System.out.println("b:"+b); // 100, 자신 클래스의 필드 b System.out.println("super.b:"+super.b); // 20나옴 super 클래스의 b필드 System.out.println("x:"+x); // 50, 지역 변수 System.out.println("this.x:"+this.x); // 200, 자신 클래스의 x필드 값 System.out.println("y:"+y); // 300, } }
super는 상속해준 클래스에 접근한다.
그래서 super.b하면 Test2의 b의 값이 나온다.
package ex0722; public class Ex03_Inheritance { public static void main(String[] args) { // TODO Auto-generated method stub Sample3 ss = new Sample3(); ss.disp(); /* * - 하위 클래스의 객체를 생성하는 경우 * 1. 상위 클래스의 필드 메모리 할당, 기본값 초기화, 초기화 블럭 실행 * 2. 하위 클래스의 필드 메모리 할당, 기본값 초기화, 초기화 블럭 실행 * 3. 상위 클래스의 생성자 몸체 실행(하위 클래스 생성자의 최상단의 super([인수])가 호출되어 실행됨) * 4. 하위 클래스의 생성자 몸체 실행 */ } } class Test3{ int a=10; public Test3() { System.out.println("Test3 생성자..."); } public void print() { System.out.println(a); } } class Sample3 extends Test3 { int x=100; public Sample3() { super(); // 상위 클래스 생성자 몸체 호출. 최상단에 한번만 가능. //없으면 컴파일할때 컴파일러가 super();추가하여 상위 클래스의 디폴트 생성자 몸체 호출 System.out.println("Sample3 생성자..."); } public void disp() { System.out.println(a+","+x); } }
package ex0722; public class Ex04_Inheritance { public static void main(String[] args) { // TODO Auto-generated method stub Sample4 t4 = new Sample4(); t4.disp(); } } class Test4 { int x; public Test4(int x) { //인자가 있는 생성자만 존재 this.x = x; } public void print() { System.out.println(x); } } // 상위 클래스에 인자가 있는 생성자만 존재하면 // 하위 클래스는 생성자를 만들고 명시적으로 상위 클래스 생성자를 호출해야 한다. class Sample4 extends Test4 { int a = 10; public Sample4() { super(100); // 명시적으로 생성자를 부른 모습 } public void disp() { System.out.println(a+","+x); } }
인자가 있는 생성자는 똑같이 상속 받은 클래스도 인자를 불러줘야 한다.
super()나
this()의 형태로 부른다.
package ex0722; public class Ex05_Inheritance { public static void main(String[] args) { // TODO Auto-generated method stub Sample5 ss1 = new Sample5(); ss1.disp(); System.out.println(); Sample5 ss2 = new Sample5(77); ss2.disp(); System.out.println(); } } class Test5 { int x; public Test5() { x = 0; } public Test5(int x) { this.x = x; } public void print() { System.out.println(x); } } class Sample5 extends Test5 { int a; public Sample5() { //super(); 이 생략되어있음 a = 0; System.out.println("하위 클래스 인자 없는 생성자"); } public Sample5(int x) { this(10, x); //super와 this는 동시에 사용 불가 //this는 자기 자신의 생성자 부르는거임 밑에 있는 인자 2개인 생성자 부르는것 System.out.println("하위 클래스 인자 하나인 생성자"); } public Sample5(int a, int x) { super(x); this.a = a; System.out.println("하위 클래스 인자 두개인 생성자"); } public void disp() { System.out.println(a+","+x); } }
override
package ex0722; public class Ex06_override { public static void main(String[] args) { // TODO Auto-generated method stub Test6 tt = new Test6(); tt.setName("홍길동"); tt.setAge(20); System.out.println(tt.getName()+", "+tt.getAge()); System.out.println(tt.toString()); System.out.println(tt); } } class Test6 { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { // TODO Auto-generated method stub return name+"\t"+age; } }
toString을 오버로드한 모습이다.
기능이 바뀜
오버라이딩과 오버로드는 다름.
오버 라이딩은 재정의
반응형'프로그래밍 > JAVA 자바' 카테고리의 다른 글
추상 클래스 / 인터페이스 (0) 2021.07.26 오버라이드 / 오버로딩 / 클래스 상속 (0) 2021.07.24 Calendar 클래스 / 날짜 형식이 올바른지 판단하기 (0) 2021.07.22 기타 API (0) 2021.07.22 Calendar API / StringBuilder (0) 2021.07.21