기존 클래스의 자산을 자식 클래스에서 재사용하기 위한 것
상속의 적용
extends 키워드 사용
별도의 extends 선언이 없는 클래스들은 extends Object 가 생략됨
따라서 모든 클래스에는 Object 클래스에 정의된 메서드가 있음
// extends Object가 생략됨
public class Person{
String name;
void eat(){
System.out.println("냠");
}
void jump(){
System.out.println("폴짝");
}
}
public class SpiderMan extends Person{
boolean isSpider;
void fireWeb(){}
}
SpiderMan이 아래 Spider 클래스의 거미줄(fireWeb)을 사용할 수 있게 하자
public class Spider {
void jump() {
System.out.println("깡총거미");
}
void fireWeb() {
System.out.println("슉슉~");
}
}
public class SpiderMan extends Person{
boolean isSpider;
//has a 관계
Spider spider; //reference type => null이 초기값
public SpiderMan() {
this.spider = new Spider();
}
void fireWeb(){
if(isSpider) {
spider.fireWeb();
}else {
System.out.println("지금은 안됨");
}
}
}
스파이더맨은 Person을 상속받지만 Spider의 jump()를 사용하고 싶다.
public class Person{
void jump(){
System.out.println("인간 점프");
}
}
public class Spider {
void jump() {
System.out.println("깡총거미");
}
}
public class SpiderMan extends Person{
boolean isSpider;
//has a 관계
Spider spider;
public SpiderMan() {
this.spider = new Spider();
}
void fireWeb(){ ... }
void jump(){
if(isSpider){
spider.jump();
} else{
System.out.println("인간 점프~")
}
}
}
SpiderMan이 jump를 사용하면 Person의jump()를 하는 게 아닌 SpiderMan의 jump()를 사용한다.
=> override
@Override
어노테이션을 이용하여 이러한 조건을 만족하는지 확인할 수 있다.
this
를 통해 멤버에 접근했듯이 super
를 통해 조상 클래스 멤버 접근
super.
을 이용해 조상의 메서드 호출로 조상의 코드 재사용
void jump(){
if(isSpider){
spider.jump();
} else{
System.out.println("뛰기");
}
}
void jump(){
if(isSpider){
spider.jump();
} else{
super.jump();
}
}
위 jump()
에서 아래 jump()
로 수정하여 조상의 코드를 재사용 할 수 있다.
변수의 scope
사용된 위치에서점점 확장해가며 처음 만난 선언부에 연결됨
method 내부 -> 해당 클래스 멤버 변수 -> 조상 클래스 멤버 변수
class Parent {
String x = "parent";
}
class Child extends Parent {
String x = "child";
void method() {
String x = "method";
System.out.println("x : " + x); //가까운 곳에서 찾아서 출력 (method)
System.out.println("this.x : " + this.x); //전역변수 출력 (child)
System.out.println("super.x : " + super.x); //조상의 전역변수 출력 (parent)
}
}
public class ScopeTest {
public static void main(String[] args) {
Child child = new Child();
child.method();
}
}
this()가 해당 클래스의 다른 생성자를 호출하듯 super()는 조상 클래스의 생성자 호출
super()는 자식 클래스 생성자의 맨 첫 줄에서만 호출 가능
명시적으로 this() 또는 super()를 호출하지 않는 경우 컴파일러가 super삽입
코드를 다음과 같이 수정할 수 있다.
public class Person{
public Person(String name) {
// super() 가 생략되어 있음 => 컴파일러가 생성
this.name = name;
}
public Person() {}
String name;
void eat(){
System.out.println("냠");
}
void jump(){
System.out.println("인간 점프");
}
}
public class SpiderMan extends Person{
boolean isSpider;
//has a 관계
Spider spider; //reference type => null이 초기값
public SpiderMan() {
this("피터파커");
}
public SpiderMan(String name) {
super(name); // 조상(Person) 생성자
this.spider = new Spider();
}
void fireWeb(){
if(isSpider) {
spider.fireWeb();
}else {
System.out.println("지금은 안됨");
}
}
}
public class SpiderManTest {
public static void main(String[] args) {
SpiderMan sman = new SpiderMan();
sman.isSpider = true;
sman.jump();
sman.fireWeb();
System.out.println(sman.name);
}
}
위 SpiderManTest를 실행하면
인간 점프
슉슉~
피터파커
가 출력된다. 어떤 과정으로 해당 출력문이 생성되는지 따라가보도록.
@Depricated
:@Override
:SuppressWarnings
:다른 패키지에 선언된 클래스를 사용하기 위해 키워드
선언 방법
몇글자 쓰고 ctrl
+ shift
+ o
하면 자동으로 추가
클래스, 변수, 메서드 선언부에 함께 사용되어 부가적인 의미 부여
종류
접근 제한자 ( 중복 불가 / 순서 상관 없음)
그 외 제한자 ( 중복 허용 / 순서 상관 없음 )
마지막, 더 이상 바뀔 수 없음
final class - 더 이상 확장할 수 없음 : 상속 금지 -> 오버라이드 방지
final method - 더 이상 재정의할 수 없음
final variable - 더 이상 값을 바꿀 수 없음 (상수)
static final
Math.PI
, Math.E
, ..)