상속이란 ?
부모 역할을 하는 클래스가 자식 역할을 하는 클래스에게 클래스 멤버와 메소드를 물려주는 것을 상속이라고 한다.
- 기존에 선언된 클래스의 필드를 다른 클래스의 필드로 사용하고자 할 때 사용한다.
- 여러 클래스 선언 시 공통필드가 있을 경우 부모 클래스를 선언하고 기존 클래스들에게 상속해준다.
상속을 사용하는 이유
코드 재사용성 증가되므로, 유지 보수가 용이해진다.
상속 구현 방법
자식 클래스를 선언할 때, extends 키워드를 사용해 상속 받을 클래스를 뒤에 선언한다. 뒤에 선언된 클래스가 부모 클래스 역할을 하게 된다.
class A { // 부모 클래스
// 실행할 문장
}
class B extends A { // extends A를 하게 되면서 A가 B의 부모 클래스가 됨.
// 자식 클래스는 부모 클래스 기능들을 모두 물려받게 됨.
}
상속 예시
public class Book {
String title;
int price;
void info() {
System.out.printLn("책의 제목은 " + title + "이고, 가격은 " + price + "원 입니다." );
}
}
public class Comic extends Book { // Comic 클래스의 부모 클래스는 Book > 모든 기능을 물려받음
// 클래스 안에 아무것도 선언하지 않음
}
public class Test01 {
public static void main(String[] args) {
Comic comicBook = new Comic();
comicBook.title = "포켓몬";
comicBook.price = 4500;
comicBook.info();
}
}
// [출력 결과]
// 책의 제목은 포켓몬이고, 가격은 4500원 입니다.
위 처럼 Comic 클래스에서 아무것도 구현하지 않아도, Book 클래스에 있는 필드와 메소드를 가져다가 사용할 수 있다.
super() : 부모 생성자
자식 클래스 타입의 객체로 부모 필드에 접근할 수 있다. 하지만 자식 생성자만 호출하기 때문에, 자식 필드만 메모리에 할당한다고 생각할 수 있다. 사실 자식 생성자에서 항상 부모 생성자를 호출하기 때문에 자식 객체에서도 자식 필드에 접근할 수 있다. 이 때 부모 생성자를 호출하는 방법은 super()를 사용하는 것이다. 만약, super()를 작성하지 않더라도 컴파일러가 자동으로 작성해준다.
상속에서 생성자 선언방법
public class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
}
public class Customer extends Person {
int memberID;
Customer(String name, int age, int memberID) {
super(name, age); // 부모 클래스의 생성자 호출
this.memberID = memberID;
}
}
오버라이딩
자식 클래스가 상속받은 메소드의 내용을 변경해서 사용하는 것을 오버라이딩이라고 한다.
오버라이딩 주의 사항
- 부모 클래스의 메소드 이름/반환 타입/매개변수와 동일해야 한다.
- 부모 클래스의 메소드보다 접근 제한을 줄일 수는 있으나 (범위를 넓힐 수 있으나) 접근 제한을 늘릴 수는 없다. (범위를 좁힐 수는 없다) Ex) default => public (o) / public => private (x)
오버라이딩 선언 방법
public class Computer {
void powerOn() {
System.out.println("컴퓨터가 켜졌습니다.");
}
void powerOff() {
System.out.println("컴퓨터가 종료됩니다.");
}
}
public class Samsong extends Computer {
@Override
void powerOn() {
System.out.println("삼송");
}
}
public class Test01 {
public static void main(String[] args) {
Samsong s = new Samsong();
s.powerOn(); // 오버라이딩된 메소드
s.powerOff();
Computer c = new Computer();
c.powerOn();
c.powerOff();
}
}
// [출력 결과]
// 삼송
// 컴퓨터가 종료됩니다.
// 컴퓨터가 켜졌습니다.
// 컴퓨터가 종료됩니다.
위와 같이 자식 클래스에서 오버라이딩 했을 시 자식 객체에서 호출 시엔 자식 클래스에서만 오버라이딩된 메소드로 호출 할 수 있다.
※ 오버로딩과 오버라이딩의 차이점
오버로딩은 새로운 메소드를 정의하는 것이고, 오버라이딩은 상속받은 기존의 메소드를 재정의하는 것을 말한다.
접근자
제한자란 ?
클래스, 변수 또는 메소드의 선언부에 함께 사용해 부가적인 의미를 부여하는 키워드를 말한다. 자바에서 제한자는 접근 제한자와 기타 제한자로 구분한다.
접근 제한자란 ?
모든 클래스와 모든 멤버에 외부에서 접근하지 못하도록 접근 권한을 제한할 수 있다. 접근이 필요하지 않은 곳에서의 사용을 막거나, 특정 범위에서만 접근할 수 있게 하기 위함이다. 이것은 객체 지향 프로그래밍의 특징 중에 한 가지인 정보 은닉을 지키기 위한 중요한 부분이다.
접근 제한자의 종류
- default : 다른 패키지에서 접근이 불가하다.
- public : 제한 없이 모든 패키지, 모든 클래스에서 접근 가능하다.
- protected : 같은 패키지 안에서 접근 가능하며, 다른 패키지라도 자식 클래스라면 접근 가능하다.
- privated : 같은 클래스 내에서만 접근 가능하다.
- 범위 크기 : public > protected > default > private
public
- public 클래스 / 생성자 : 모든 패키지, 모든 클래스 어디서나 해당 클래스로 객체를 생성할 수 있다.
- public 멤버(필드, 생성자, 메소드) : 모든 패키지, 모든 클래스 어디서나 객체를 통해서 접근할 수 있다.
default
- default 클래스 / 생성자 : 같은 패키지 내에서 어디서나 호출이 가능하며, 객체를 생성할 수 있다.
- default 멤버 필드 / 메소드 : 같은 패키지 내에서 제한 없이 접근 및 사용할 수 있다.
protected
- protected 생성자 : 같은 패키지의 클래스에서 생성자를 호출해 객체를 생성할 수 있다. 또한, 다른 패키지더라도 해당 클래스의 자식 클래스라면 생성자를 호출해 객체를 생성할 수 있다.
- protected 필드 / 메소드 : 같은 패키지의 클래스에서 접근 및 사용할 수 있으며, 해당 클래스의 자식 클래스라면 다른 패키지에서라도 사용할 수 있다.
private
- private 생성자 : 클래스 외부에서 객체를 생성할 수 없으며, 클래스 내부에서만 생성자를 호출해 객체를 생성할 수 있다.
- private 필드 / 메소드 : 클래스 외부에서 접근할 수 없으며, 클래스 내부에서만 사용할 수 있다.
final 클래스
클래스 앞에 fianl을 추가할 경우, 이 클래스는 상속의 마지막 클래스임을 뜻한다. 어떠한 클래스도 이 클래스의 자식 클래스가 될 수 없다.
final 클래스 선언 방법
접근 제한자 final class 클래스명 {
// 실행할 문장
}
final 메소드
자식 클래스이더라도 부모 클래스에서 final로 선언된 메소드는 자식 클래스에서 오버라이딩 할 수 없는 메소드이다.
final 메소드 선언 방법
접근 제한자 final 리턴 타입 메소드(매개변수1, 매개변수2, ...) {
// 실행할 문장
}
객체 지향의 특징
- 캡슐화
- 객체 내부의 멤보(필드, 메소드 등)를 객체 외부에서 볼 수 없도록 캡슐화 한다. 접근이 필요한 값의 경우 public 메소드를 활용하여 접근을 허용하고, 이외의 값들은 모두 캡슐화를 통해 정보를 은닉한다.
- 추상화
- 공통된 기능과 정보를 추출해 객체화한다.
- 상속
- 미리 정의된 부모 클래스의 모든 멤버를 자식 클래스가 물려받는다.
- 다형성
- 하나의 방법으로 여러 객체를 호출하여 사용할 수 있다.
'JAVA > JAVA 정리' 카테고리의 다른 글
[JAVA] 추상클래스 & 추상메소드 (0) | 2023.05.30 |
---|---|
[JAVA] 다형성과 타입 변환 (0) | 2023.05.26 |
[JAVA] 생성자 (0) | 2023.05.24 |
[JAVA] 메소드 (2) | 2023.05.23 |
[JAVA] 클래스 (0) | 2023.05.22 |