Inheritance
기존의 클래스를 재사용하여 새로운 클래스를 작성하는 문법 요소.⠀
extends
를 사용하여 상속을 표현함class Person { String name; int age; void wakeup(){ System.out.println("일어나기"); } } // extends를 이용하여 person 클래스 상속 class Student extends Person { String major; void coding(){ System.out.println("코딩하기"); } } public class Main { public static void main(String[] args){ Person p = new Person(); // person 객체 생성 p.name = "김자바"; p.age = 77; p.wakeup(); Student s = new Student(); // student 객체 생성 s.name = "박자바"; // person 에서 상속 받음 s.coding(); // student 의 개별 기능 s.major = "engineering" // student 의 개별 기능 System.out.println(s.major); } }
~은 ~이다
와 같은IS-A
관계일 경우 상속,~를 ~가지고 있다
와 같은HAS-A
관계일 경우 포함.extends Object
상속.Method Overriding : 상위 클래스로부터 상속받은 메서드와 동일한 이름의 메서드를 재정의하는 것.
반드시 위의 3가지 조건을 만족해야 한다.
public class Main { public static void main(String[] args) { Guitar guitar = new Guitar(); // 각각의 타입으로 선언 guitar.play(); Instrument piano = new Piano(); // 상위 클래스 타입으로 선언 piano.play(); } } class Instrument { void play() { System.out.println("This is musical instrument"); } } class Guitar extends Instrument { void play() { System.out.println("This is guitar"); } } class Piano extends Instrument { void play() { System.out.println("This is piano"); } }
출력
This is guitar
This is piano
public class Main { public static void main(String[] args) { Lower l = new Lower(); l.callNum(); } } class Upper { int count = 20; // super.count } class Lower extends Upper { int count = 15; // this.count void callNum() { System.out.println("count = " + count); // 15 System.out.println("this.count = " + this.count); // 15 System.out.println("super.count = " + super.count); // 20 } // super를 이용하여 부모 객체 멤버의 값 참고 }
생성자 내부에서만 사용 가능하고, 반드시 첫 줄에 작성해야 함.public class Main { public static void main(String[] args) { Art a = new Art(); } } class Major { Major() { System.out.println("Major 클래스 생성자"); } } class Art extends Major { // Major 클래스로부터 상속 Art() { super(); // 상위클래스의 생성자 호출 System.out.println("Art 클래스 생성자"); } }
출력값
Major 클래스 생성자
Art 클래스 생성자
Encapsulation
특정 객체 안에 관련된 속성과 기능을 하나의 캡슐로 만들어 데이터를 외부로 부터 보호
목적 : 데이터 보호 / 내부적으로만 사용되는 데이터의 불필요한 외부 노출 방지
package 패키지명
으로 선언, 하지 않을 경우 이름없는 패키지에 속하게 됨.import
뒤에 패키지명과 패키지명을 생략하고자 하는 클래스명을 작성하며, 한 패키지에서 여러 클래스를 참조할 경우 클래스명 대신 *
으로 작성하면 됨.import 패키지명.클래스명; or import 패키지명.*;
private
: 동일 클래스에서만 접근 가능default
: 동일 패키지 내에서만 접근 가능protected
: 동일패키지 + 타 패키지 하위 클래스(==상속받은 클래스)에서 접근 가능public
: 접근 제한 없음
private을 통해 외부로부터의 데이터 접근을 차단한 변수를
set method와 get method를 통해 데이터를 저장, 수정, 출력.
private int price; int getPrice() { return price; }
private int price; void setPrice(int price) { this.price = price; }
public class Order { public static void main(String[] args) { Pizza pizza = new Pizza(); pizza.setPrice(12000); int order = pizza.getPrice(); System.out.println("피자는 "+order+"원 입니다."); } } public class Pizza{ private int price; public int getPrice(){ return price; } public void setPrice(int price){ this.price = price; } }
피자는 12000원 입니다.