일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- list
- javaservlet
- 상속
- File 클래스
- 파일 입출력
- Event
- 연산자
- 코틀린#클래스#상속
- 데이터베이스
- jQuery
- 다형성
- html
- 윈도우 #단축키
- 오라클
- jsp
- JavaScript
- 설치
- property
- function
- GUI
- String
- Method
- 연락처 프로그램
- 자바
- Java
- springframework
- css
- array
- kotlin #return #jump
- spring
- Today
- Total
Binary World
JAVA CLASS : 상속(Inheritance) 본문
<상속(Inheritance)>
* 자바에서 상속의 개념은 부모(super) 클래스의 멤버를 자식(sub) 클래스에 물려주는 것을 의미
* 자식클래스는 부모에서 선언된 멤버 변수와 메소드들을 사용할 수 있음
* 부모클래스는 자식 클래스의 멤버 변수와 메소드를 사용할 수 없음
<Java Practice>
1. 상속의 기본 형태(기본 티비를 스마트 티비 등에 상속하는 기본 코드
* BasicTv.java (기본 티비, 부모 클래스)
package edu.java.inherit01; public class BasicTv { // 멤버 변수(필드, 프로퍼티) private boolean powerOn; private int channel; private int volume;
// 생성자 public BasicTv() {}
// 메소드 public void turnOnOff() { if (powerOn) { powerOn = false; System.out.println("TV가 꺼졌습니다..."); } else { powerOn = true; System.out.println("TV가 꺼졌습니다..."); } } // end turnOnOff() } // end class BasicTv |
* SmartTv.java (스마트 티비, 자식 클래스)
package edu.java.inherit01; // 상위(super) 클래스, 부모(parent) 클래스 // 하위 (sub) 클래스, 자식(child) 클래스, 유도(derived) 클래스 // class Subclass extends Superclass public class SmartTv extends BasicTv { // 멤버 변수 private String ip;
// 생성자 public SmartTv() {}
// 메소드 public String getIp(){ return ip; }
public void setIp(String ip){ this.ip = ip; }
} // end SmartTv |
* InheritMain01
package edu.java.inherit01; public class InheritMain01 { public static void main(String[] args) { // SmartTv 클래스의 인스턴스 생성 SmartTv tv1 = new SmartTv(); tv1.turnOnOff(); tv1.setIp("192.168.11.31"); System.out.println(tv1.getIp());
BasicTv tv2 = new BasicTv(); tv2.turnOnOff(); // tv2.setIp(""); // 부모 클래스가 자식 클래스의 메소드를 사용할 수 없음. } // end main() } // end class InheritMain01 |
* 출력화면
TV가 꺼졌습니다... 192.168.11.31 TV가 꺼졌습니다... 코멘트 : 부모 클래스로 부터 변수와 메소드를 받았기 때문에 사용 가능 |
2. 부모 클래스와 자식 클래스의 생성자 출력
*person.java
package edu.java.inherit02; public class Person { // 멤버 변수 private String name;
// 생성자 public Person() { System.out.println("Person 생성자"); }
public Person(String name) { this.name = name; System.out.println("Person(name) 생성자"); }
// 메소드 public String getName() { return name; }
public void setName(String name){ this.name = name; } } // end Person
|
* BusinessPerson.java
package edu.java.inherit02; // Person 클래스를 상속받는 BusinessPerson 클래스를 선언 public class BusinessPerson extends Person { // 멤버 변수 private String company;
// 생성자 // 자식 클래스의 생성자가 호출되면, 부모 클래스의 생성자가 먼저 호출되어야 함. // 부모 클래스의 생성자를 명시적으로 호출할 때는 super(); // 부모 클래스의 생성자를 명시적으로 호출하지 않으면, // 부모 클래스의 "기본 생성자"가 자동으로 호출됨! // 부모 클래스의 매개 변수가 있는 생성자는 자동으로 호출되지 않기 때문에, // 필요한 경우는 반드시 명시적으로 호출해야 함! // 예) super(name); // 자식 클래스의 생성자에서 부모 클래스의 생성자를 호출할 때는 // 다른 어떤 코드보다 먼저 부모 클래스를 호출해야 함
public BusinessPerson() { super(); // 부모 클래스 생성자 호출 -> 생략 가능 System.out.println("BusinessPerson 생성자"); }
public BusinessPerson(String name, String company){ super(name); // 부모 클래스의 매개변수 생성자를 명시적으로 호출 -> 생략 불가 //setName(name); // 부모 클래스의 기본 생성자를 호출 후 setter 메소드 호출됨 this.company = company; System.out.println("BP(name, company) 생성자"); }
public String getCompany(){ return company; }
public void setCompany(String company) { this.company = company; } } // end class BusinessPerson |
* InheritMain02.java
package edu.java.inherit02; public class InheritMain02 { public static void main(String[] args) { // person 클래스의 인스턴스 생성 Person p1 = new Person(); System.out.println(p1); p1.setName("진혁"); System.out.println(p1.getName());
System.out.println("===================="); // BusinessPerson 클래스의 인스턴스 생성 BusinessPerson p2 = new BusinessPerson();
System.out.println("==================="); BusinessPerson p3 = new BusinessPerson("진혁", "아이티윌"); System.out.println(p3.getName()); System.out.println(p3.getCompany()); } // end main() } //end InheritMain02 |
* 출력화면
Person 생성자 edu.java.inherit02.Person@15db9742 진혁 ==================== Person 생성자 BusinessPerson 생성자 =================== Person(name) 생성자 BP(name, company) 생성자 진혁 아이티윌
코멘트 : 메소드 변수 타입에 따라 출력되는 생성자가 다름 |
3. 부모 클래스에 기본생성자가 없을 때 호출하는 방법
* Phone.java (부모 클래스)
package edu.java.inherit03; public class Phone { // 멤버 변수 private String phoneNo; // 생성자 // 생성자를 하나라도 생성하면 컴파일러는 기본 생성자를 제공하지 않음 // public Phone() {} public Phone(String phoneNo) { this.phoneNo = phoneNo; System.out.println("Phone(phoneNo) 생성자 호출"); } // 메소드 public String getPhoneNo() { return phoneNo; } public void setPhoneNo(String phoneNo) { this.phoneNo = phoneNo; } } // end class Phone |
* SmartPhone.java (자식 클래스)
package edu.java.inherit03; public class SmartPhone extends Phone { // 멤버 변수 private String ip; // 생성자 // 생성자의 호출 : // 자식 클래스의 생성자가 호출되면, // 부모 클래스의 생성자가 먼저 실행된 후, 자식 클래스의 코드들이 실행됨 // 1) 부모 클래스의 생성자를 명시적으로 호출하지 않을 때는 super()가 자동으로 호출됨 // 2) 부모 클래스의 생성자를 명시적으로 super(); 또는 super(매개변수); 호출할 수 있음 // 만약에 부모 클래스가 기본 생성자를 가지고 있지 않은 경우에는 // super()가 자동으로 호출될 수 없기 때문에, // 자식 클래스의 생성자에서 super(매개변수)를 호출하는 코드(아래)가 반드시 있어야됨 public SmartPhone() { super(null); // 부모 클래스의 기본생성자가 없을 때 에러를 없애줄 수 있음 System.out.println("SmartPhone() 생성자 호출"); } public SmartPhone(String phoneNo) { super(phoneNo); // 생략 불가 setPhoneNo(phoneNo); // 컴파일 에러 System.out.println("SmartPhone(phoneNo) 생성자 호출"); } public SmartPhone(String phoneNo, String ip){ super(phoneNo); this.ip = ip; System.out.println("SmartPhone(phoneNo, ip) 생성자 호출"); } } // end class SmartPhone |
*InheritMain03.java (메인 클래스)
package edu.java.inherit03; public class InheritMain03 { public static void main(String[] args){ SmartPhone phone1 = new SmartPhone();
SmartPhone phone2 = new SmartPhone("010-1111-1222"); System.out.println(phone2.getPhoneNo());
SmartPhone phone3 = new SmartPhone("1234", "1111.222.123.131"); System.out.println(phone3.getPhoneNo());
} // end main() } // end class InheritMain03 |
* 출력화면
Phone(phoneNo) 생성자 호출 SmartPhone() 생성자 호출 Phone(phoneNo) 생성자 호출 SmartPhone(phoneNo) 생성자 호출 010-1111-1222 Phone(phoneNo) 생성자 호출 SmartPhone(phoneNo, ip) 생성자 호출 1234 코멘트 : - |
4. 메소드 오버라이딩 하는 코드
* Animal.java (부모 클래스)
package edu.java.inherit04; public class Animal { private String name;
// 생성자 public Animal() {} public Animal(String name) { this.name = name; }
// 메소드 public void speak() { System.out.println("동물이 말합니다..."); } } |
* Dog.java (자식 클래스)
package edu.java.inherit04; public class Dog extends Animal { // 멤버 변수 private String type;
// 생성자 overloading public Dog() {} public Dog(String name, String type){ super(name); this.type = type; }
// 메소드 재정의(override) // 부모 클래스가 가지고 있는 메소드를 자식 클래스에서 재정의(다시 정의) // 메소드의 리턴 타입, 이름, 매개변수 모두 일치해야 함. @Override // annotation(어노테이션):자바 컴파일러에 알려주는 역할 public void speak() { System.out.println("멍멍..."); }
// 메소드 오버로딩(overloading): // 매개 변수가 다른 메소드를 여러개 정의하는것 public void speak(String str){ System.out.println(str); }
} // end class Dog |
* InheritMain04(메인 클래스)
package edu.java.inherit04; public class InheritMain04 { public static void main(String[] args){ Animal animal = new Animal("애완동물"); animal.speak(); // Animal 클래스의 speak()가 출력됨
System.out.println();
Dog dog = new Dog("달리", "포메리안"); dog.speak(); // dog 클래스의 speak()가 출력됨
} // end main() } // end class InheritMain04 |
* 출력화면
동물이 말합니다... 멍멍... 코멘트 : 메소드 오버라이딩 되면 부모 메소드의 내용을 덮어 씌운다고 생각하는게 좋다. |
5. Object 클래스 오버라이딩
* Person.java (person 클래스의 toString이 주소값이 아닌 name 값을 출력하게 오버라이딩)
package edu.java.inherit05; public class Person { private String name;
public Person(String name){ this.name = name; }
public String getName(){ return name; }
@Override public String toString(){ return name; } // toString()이 name값을 출력하도록 변환시켰음
} // end class Person // 자바의 모든 클래스의 java.lang.Object 클래스를 상속받아서 만들어짐! // 자바의 모든 클래스는 Object 클래스의 public 메소드들을 상속받아서 사용 가능 // Object 클래스의 toString() 메소드 : // 패키지이름.클래스이름@참조값(주소값) |
* Point.java (point 클래스의 toString이 좌표형태로 리턴되게 오버라이딩)
package edu.java.inherit05; public class Point { private double x; private double y;
public Point(double x, double y){ this.x = x; this.y = y; }
@Override public String toString() { return "(" + x + ", " + y + ")"; } } // end class point |
* InheritMain05
package edu.java.inherit05; public class InheritMain05 { public static void main(String[] args) { // String str = new String("문자열"); System.out.println(str);
System.out.println(); // Person 클래스의 인스턴스 생성 Person p1 = new Person("진혁"); System.out.println(p1); // println(Object): // Object 클래스의 toString() 리턴값을 화면 출력하도록 만들어져 있음
System.out.println(); Point pt = new Point(1,1); System.out.println(pt);
} // end main() } // end class InheritMain05 |
'개발자의 길 > JAVA' 카테고리의 다른 글
JAVA CLASS : 상속(final, abstract) (0) | 2017.01.03 |
---|---|
JAVA CLASS : 상속(다형성) (0) | 2017.01.03 |
JAVA CLASS : 자바 연락처(contact) 프로그램 ver 0.1 (0) | 2016.12.30 |
JAVA CLASS : 접근 제한자(final 변수, static 변수) (0) | 2016.12.30 |
JAVA CLASS : 접근 제한 수식어를 이용한 두 점 사이의 거리구하기 (0) | 2016.12.30 |