클래스
상속
- 키워드 extends 사용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Person {
String name;
void setName(String name) {
this.name = name;
}
}
class Woman extends Person {
void sleep() {
System.out.println(this.name+" is sleeping");
}
}
public class Sample {
public static void main(String[] args) {
Woman woman = new Woman();
woman.setName("Betty");
System.out.println(woman.name); // Betty
}
}
- Woman 클래스에 name 이라는 객체변수와 setName이라는 메소드를 만들지 않았지만 Person 클래스를 상속했기 때문에 그대로 사용이 가능
- Woman 클래스는 Person 클래스보다 좀 더 많은 기능(sleep메소드) 보유: 기능 확장
- 보통 부모 클래스를 상속받은 자식 클래스는 부모 클래스의 기능에 더하여 좀 더 많은 기능을 갖도록 작성
- 보통 부모 클래스를 상속받은 자식 클래스는 부모 클래스의 기능에 더하여 좀 더 많은 기능을 갖도록 작성
IS-A 관계
- “Woman is a Person” 과 같이 말할 수 있는 관계
- 상속관계에 있을 때 자식 클래스의 객체는 부모 클래스의 자료형인 것처럼 사용 가능
※ 주의- Woman 객체를 Person 자료형으로 사용할 경우에는 Woman 클래스에만 존재하는 sleep 메소드를 사용할 수 없다. (Person 클래스에 구현된 setName 메소드만 사용이 가능)
1
2
3
Person woman = new Woman(); // Woman is a Person (O)
Woman woman = new Person(); // 오류: Person is a woman (X)
참고사항
Object 클래스
- 자바에서 만드는 모든 클래스는 Object 클래스를 상속받는다. 하지만 굳이 아래 코드처럼 Object 클래스를 상속하도록 코딩하지 않아도 자바에서 만들어지는 모든 클래스는 Object 클래스를 자동으로 상속받게끔 되어 있다.
- 자바에서 만드는 모든 객체는 Object 자료형으로 사용 가능
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Animal {
String name;
public void setName(String name) {
this.name = name;
}
}
public class Sample {
public static void main(String[] args) {
Object animal = new Animal(); // Animal is a Object
Object dog = new Dog(); // Dog is a Object
}
}
메소드 오버라이딩
- 부모클래스의 메소드를 자식클래스가 동일한 형태로 또다시 구현하는 행위 (메소드 덮어쓰기)
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
29
30
31
class Person {
String name;
void setName(String name) {
this.name = name;
}
void sleep() {
System.out.println(this.name+" is sleeping");
}
}
class Woman extends Person {
void sleep() {
System.out.println(this.name+" is sleeping and moving");
}
}
class Man extends Person{
void sleep() {
System.out.println(this.name+" is sleeping and snoring");
}
}
public class Sample {
public static void main(String[] args) {
Man man = new Man();
man.setName("John");
man.sleep(); // John is sleeping and snoring
}
}
메소드 오버로딩
- 입력항목이 다른 경우 동일한 이름의 다른 메소드 형성
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
29
30
31
32
33
34
35
class Person {
String name;
void setName(String name) {
this.name = name;
}
void sleep() {
System.out.println(this.name+" is sleeping");
}
}
class Woman extends Person {
void sleep() {
System.out.println(this.name+" is sleeping and moving");
}
}
class Man extends Person{
void sleep() {
System.out.println(this.name+" is sleeping and snoring");
}
void sleep(int hour){
System.out.println(this.name + " zzz in house for " + hour + " hours");
}
}
public class Sample {
public static void main(String[] args) {
Man man = new Man();
man.setName("John");
man.sleep(); // John is sleeping and snoring
man.sleep(3); // John zzz in house for 3 hours
}
}
생성자
- “객체지향 프로그래밍” part에서 dog의 이름을 초기화하지 않아 null 이 출력 –> 이를 메소드 setName을 이용해 해결
- 이번에는 생성자를 통해 초기화
Call by value
- 메소드에 값을 전달하는 것과 객체를 전달하는 것에 큰 차이 존재
- 메소드로 객체를 전달할 경우 메소드에서 객체의 객체변수(속성) 값 변경 가능
- 생성자는 메소드와 다르게 name 이라는 객체변수에 값을 무조건 설정해야만 객체가 생성될 수 있도록 강제 할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Animal {
String name;
Animal(String name){
this.name = name;
}
/*public void setName(String name) {
this.name = name;
}*/
}
public class Sample {
public static void main(String[] args) {
Animal dog = new Animal("Happy");
System.out.println(dog.name); // Happy
}
}
디폴트 생성자
- 생성자의 입력 항목이 없고 생성자 내부에 아무 내용이 없는 생성자
- 만약 클래스에 생성자가 하나도 없다면 컴파일러는 자동으로 디폴트 생성자 추가
- 사용자가 작성한 생성자가 하나라도 구현되어 있다면 컴파일러는 디폴트 생성자 추가 X
1
2
3
4
class Dog extends Animal {
Dog() {
} // 디폴트 생성자
}
생성자 오버로딩
- 입력 항목이 다른 생성자 (※ 메소드 오버로딩과 동일한 개념)
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
class Animal {
String name;
void setName(String name) {
this.name = name;
}
}
class Dog extends Animal {
Dog(String name) {
this.setName(name);
}
Dog(int type){
this.setName("happy"+type);
}
}
public class Sample {
public static void main(String[] args) {
Dog dog1 = new Dog("Mong");
Dog dog2 = new Dog(2);
System.out.println(dog1.name); // Mong
System.out.println(dog2.name); // happy2
}
}
참고자료
점프 투 자바 - 객체지향 프로그래밍