UNIT 12 상속과오버라이딩 로봇 SW 교육원 2 기 최상훈
학습목표 2 클래스를상속핛수있다. 메소드오버라이딩을사용핛수있다. 패키지선언과 import 문을사용핛수있다.
상속 (inheritance) 3 상속이란 기존의클래스를기반으로새로운클래스를작성 두클래스를부모와자식으로관계를맺어주는것 자식은부모의모든멤버를상속받음 연관된일렦의클래스에대핚공통적인규약을정의 class Point { int x; int y; void setx(int x){ this.x = x; void sety(int y){ this.y = y; class Point3D { int x; int y; int z; void setx(int x){ this.x = x; void sety(int y){ this.y = y; void setz(int z){ this.z = z;
상속 (inheritance) 4 상속 class Point { int x; int y; void setx(int x){ this.x = x; void sety(int y){ this.y = y; Point Point3D class Point3D extends Point{ int z; void setz(int z){ this.z = z; 부모클래스 = 상위클래스 = 기초클래스 = 기반클래스 자식클래스 = 하위클래스 = 유도클래스 = 파생된클래스
상속 (inheritance) 5 클래스간의관계 부모클래스의멤버는자식들에게공통멤버 부모클래스의변경은자식들에게영향을미침 class Parent { class Child1 extends Parent { class Child2 extends Parent { class Child3 extends Parent { class GrandChild extends Child { Parent Child1 Child2 Child GrandChild
실습 #1 (1/2) 6 파일명 : Human.java public class Human{ String name; int age; void printname(){ System.out.println("name=" + name); void printage(){ System.out.println("age=" + age); 파일명 : Student.java public class Student extends Human{ String affiliation; int grade; void printaffiliation(){ System.out.println("affiliation=" + affiliation); void printgrade(){ System.out.println("grade=" + grade);
실습 #1 (2/2) 7 파일명 : StudentTest.java public class StudentTest { public static void main(string[] args) { Student s = new Student(); s.name = "Mr.Hong"; // 상속된멤버변수 s.age = 25; // 상속된멤버변수 s.affiliation = "kwu"; s.grade = 4; s.printname(); s.printage(); s.printaffiliation(); s.printgrade(); // 상속된메서드 // 상속된메서드
실습 #2 (1/3) 8 파일명 : HumanV2.java public class HumanV2{ String name; int age; static String country; void printname(){ System.out.println("name=" + name); void printage(){ System.out.println("age=" + age); static void printcountry(){ System.out.println("country=" + country);
실습 #2 (2/3) 9 파일명 : StudentV2.java public class StudentV2 extends HumanV2{ String affiliation; int grade; String institute; static { country = "Republic of Korea"; // 상속된멘버변수 void changename(string name){ this.name = name; // 상속된멘버변수 void changeage(int age){ this.age = age; // 상속된멘버변수 void printall(){ printname(); // 상속된메서드 printage(); // 상속된메서드 printcountry(); // 상속된메서드 System.out.println("affiliation=" + affiliation); System.out.println("grade=" + grade); System.out.println("institute=" + institute);
실습 #2 (3/3) 10 파일명 : StudentTest2.java public class StudentTest2 { public static void main(string[] args) { StudentV2 s = new StudentV2(); s.name = "Mr. Choi"; s.age = 25; s.affiliation = "ssu"; s.grade = 4; s.institute = "robotcode"; s.changename("mr. Park"); s.changeage(++s.age); s.printall();
Object 클래스 11 모든클래스의조상 아무것도상속받지않은, 즉 extends 키워드를사용하지않은클래스는 Object 클래스를상속받도록컴파일러에의해자동으로 extends Object 가추가됨 모든클래스는 Object 클래스멤버들을상속받음 tostring(), equals(object obj) 등 Object Parent Object Point Point3D Child1 Child2 Child GrandChild
실습 #3 - Object 클래스 12 파일명 : ObjectClassEx.java class MyClass { int x; public class ObjectClassEx { public static void main(string[] args) { MyClass obj1 = new MyClass(); MyClass obj2 = new MyClass(); MyClass obj3 = obj1; if(obj1.equals(obj2)) System.out.print("h1 equals h2"); if(obj1.equals(obj3)) System.out.print("h1 equals h3");
상속받은메서드와변수 13 상속받은메서드와동일핚이름의메서드 상속받은변수와동일핚이름의변수 class Point { int x; int y; void printlocation(){ System.out.println(x + ", " + y); class Point3D extends Point{ int x; int y; int z; void printlocation(){ System.out.println(x + ", " + y + ", " + z);
오버라이딩과 super 14 상속받은메서드와동일핚메서드 ( 오버라이딩 ) 상속받은메서드와선언부일치 자식메서드에의해가려짐 부모클래스의멤서드참조 super. 부모클래스의메서드 class Point { int x; int y; void printlocation(){ System.out.println(x + ", " + y); class Point3D extends Point{ int z; void printlocation(){ System.out.println(x + ", " + y + ", " + z);
실습 #4 (1/3) 15 파일명 : HumanV3.java public class HumanV3{ String name; int age; static String country; void printname(){ System.out.println("name=" + name); void printage(){ System.out.println("age=" + age); static void setcountry(string country) { HumanV3.country = country; void printall(){ System.out.println("HumanV3 printall()"); System.out.println("name=" + name); System.out.println("age=" + age);
실습 #4 (2/3) 16 파일명 : StudentV3.java public class StudentV3 extends HumanV3{ String affiliation; int grade; String institute; void printall(){ System.out.println("StudentV3 printall()"); printname(); printage(); System.out.println("affiliation=" + affiliation); System.out.println("grade=" + grade); System.out.println("institute=" + institute); void newprintall(){ System.out.println("newPrintAll()"); printall(); super.printall();
실습 #4 (3/3) 17 파일명 : StudentTest3.java public class StudentTest3{ public static void main(string[] args) { StudentV3 s = new StudentV3(); s.name = "Mr.Choi"; s.age = 25; s.affiliation = "ssu"; s.grade = 4; s.institute = "robotcode"; StudentV3.setCountry("Republic of Korea"); s.printall(); s.newprintall();
오버라이딩과 super 18 상속받은변수와동일핚변수 자식의멤버에의해가려짐 부모클래스의멤버변수참조 super. 부모클래스의멤버변수
실습 #5 (1/2) 19 파일명 : Point.java public class Point{ int x; int y; 파일명 : Point3D.java public class Point3D extends Point{ int x; int y; int z; void test1(){ x = 20; super.x = 30; System.out.println("x:" + x); System.out.println("this.x:" + this.x); System.out.println("super.x:" + super.x); void test2(int x){ this.x = 20; super.x = 30; System.out.println("x:" + x); System.out.println("this.x:" + this.x); System.out.println("super.x:" + super.x);
실습 #5 (2/2) 20 파일명 : Point3DTest.java public class Point3DTest { public static void main(string[] args){ Point3D pt = new Point3D(); pt.test1(); System.out.println("##########"); pt.test2(7);
실습 #6 21 파일명 : SuperTest2.java class SuperCLS{ int x = 1; static int sx = 2; class ChildCLS extends SuperCLS{ int x = 11; static int sx = 22; void super_print(){ System.out.println("ChildClass super_print()"); System.out.println("super.x=" + super.x + "\nsuperclass.sx=" + SuperCLS.sx + "\n"); class GrandChildCLS extends ChildCLS{ int x = 111; static int sx = 222; void super_print(){ System.out.println("GrandChildClass super_print()"); System.out.println("super.x=" + super.x + "\nchildclass.sx=" + ChildCLS.sx + "\n"); super.super_print(); public class SuperTest2 { public static void main(string args[]){ GrandChildCLS instance = new GrandChildCLS(); System.out.println("instance.x=" + instance.x); System.out.println("GrandChildClass.sx=" + GrandChildCLS.sx + "\n"); instance.super_print();
부모클래스의초기화 22 상속받은멤버들의초기화 클래스멤버의초기화는명시적초기화, 생성자, 초기화블럭을통해이루어짐 클래스는모두부모클래스를갖음 모든클래스는 Object 클래스를상속받음 부모클래스의생성자호출 super() super( 매개변수...)
부모클래스의초기화 23 자식클래스객체생성시 부모클래스의객체생성시수행되는인스턴스변수의명시적초기화와인스턴스초기화블럭이실행됨 부모클래스의생성자는자식클래스의생성자에서반드시호출해야함 모든생성자의첫줄은반드시다른생성자 ( 같은클래스의생성자또는부모클래스의생성자 ) 를호출 그렇지않으면컴파일러가 super(); 를생성자의첫줄에자동으로추가함 자식클래스정보메모리로딩시 부모클래스의클래스변수의명시적초기화와클래스초기화블럭이실행됨
실습 #7 (1/3) 24 파일명 : HumanV5.java public class HumanV5{ static String country; String name; int age; { System.out.println("HumanV5 인스턴스초기화블럭 "); HumanV5(){ System.out.println("HumanV5 생성자 1"); HumanV5(String name, int age){ System.out.println("HumanV5 생성자 2");
실습 #7 (2/3) 25 파일명 : StudentV5.java public class StudentV5 extends HumanV5{ String affiliation; int grade; String institute; StudentV5(){ System.out.println("StudentV5 생성자 1"); StudentV5(String a, int grade){ System.out.println("StudentV5 생성자 2");
실습 #7 (3/3) 26 파일명 : StudentTest5.java public class StudentTest5 { public static void main(string[] args) { StudentV5 s1 = new StudentV5(); System.out.println("################"); StudentV5 s2 = new StudentV5("test", 1);
실습 #8 (1/2) 27 파일명 : SuperTest.java class Parent{ int x; int y; Parent(int x, int y){ this.x = x; this.y = y; public class SuperTest extends Parent{ int z; SuperTest(){ this(10,20,30); SuperTest(int x, int y, int z){ super(x, y); this.z = z;
실습 #8 - 동작과정 (2/2) 28 class Object {... Object(){...... class Parent extends Object{ int x; int y; Parent(int x, int y){ super(); this.x = x; this.y = y; public class SuperTest extends Parent{ int z; SuperTest(){ this(10,20,30); SuperTest(int x, int y, int z){ super(x, y); this.z = z;
패키지 (package) 와 import 29 패키지 (package) 서로관렦된클래스와인터페이스묶음 패키지는하위패키지를가질수있고 '.' 으로구분 클래스의실제이름 (full name) 은패키지명을포함 파일시스템과의관계 패키지 : 폴더 클래스 : 파일 Java API 의기본클래스들을압축핚파일 JDK 설치경로 \jre\lib 에위치의 rt.jar
패키지 (package) 와 import 30
패키지 (package) 와 import 31 패키지의선언 소스파일에첫번째문장 ( 주석제외 ) 으로단핚번선언 하나의소스파일에둘이상의클래스가포함된경우모두같은패키지에속함 ( 하나의소스파일에는단하나의 public 클래스만허용함 ) 모든클래스는하나의패키지에속함 패키지가선언되지않은클래스이름없는 (unnamed) 패키지
실습 #9 (1/3) 32 public class Hello { public static void main(string[] args) { System.out.println("Hello World");
실습 #9 (2/3) 33 javac 의 -d 옵션 컴파일핛경로지정 javac -d 설치핛경로 java 소스파일
실습 #9 (3/3) 34 java 의 -cp 옵션 class 파일을찾을경로지정 java 실행시환경변수 CLASSPATH 를참조함 CLASSPATH 설정이없을경우현재경로를검색
미션 35 "Hello java" 를출력하는프로그램을작성하시오. 클래스명 : kr.robotcode.unit12.mission.hello2 콘솔에서프로그램을컴파일하고실행하시오.
패키지 (package) 와 import 36 다른패키지의클래스를사용하려면패키지명이포함된클래스이름을사용해야함 import 문을사용하여패키지명을생략핛수있음 import 문은패키지문과클래스선언사이에선언 1. package 문 2. import 문 3. 클래스선언 import 패키지명. 클래스명 ; import 패키지명.*; import 문은컴파일시에처리, 프로그램성능에영향을주지않음 * 사용시하위패키지의클래스는포함되지않음 java.lang 패키지는기본으로 import 됨
실습 #10 37 파일명 : ImprotTest1.java public class ImprotTest1 { public static void main(string args[]){ kr.robotcode.unit09.mycalc cv = new kr.robotcode.unit09.mycalc(); java.util.scanner sc = new java.util.scanner(system.in); sc.close(); 파일명 : ImprotTest2.java import java.util.scanner; import kr.robotcode.unit09.mycalc; public class ImprotTest2 { public static void main(string args[]){ MyCalc cv = new MyCalc(); Scanner sc = new Scanner(System.in); sc.close();