클래스 vs 객체
사람, 김연아, 뽀로로, 펭귄 - 누가 객체, 누가 클래스인가?
사람의 나이는? 김연아의 나이는?
사람과 펭귄 - 포괄적인 개념이므로 알 수 없다 : 클래스(Class)
김연아와 뽀로로 - 실체적인 개념이므로 알 수 있다 : 객체(Object)
객체 지향의 4대 특성
캡상추다
캡 - 캡슐화: 정보 은닉
상 - 상속: 재사용
추 - 추상화: 모델링
다 - 다형성: 사용 편의
1. 추상화: 모델링
추상화란?
구체적인 것을 분해한다. 관찰자가 관심 있는 특성만 갖고 재조합한다.
- 객체는 유일무이한 사물이다.
- 클래스는 같은 특성을 지닌 여러 객체를 총칭하는 집합의 개념이다.
클래스를 이용해 객체(Instance) 만들기
사람 홍길동 = new 사람();
클래스 객체참조변수 = new 클래스();
*객체(Object) = 클래스의 인스턴스
클래스 설계
Person 클래스 만들기 - 사람 객체들이 가진 공통된 특성을 찾게 된다.
1. 속성: 명사로 표현됨. (시력, 몸무게, 혈액형, 키, 나이, 직업, 취미 등)
2. 메서드: 동사로 표현됨. 기능/행위를 의미하며, 수행 절차 또는 로직을 갖게 됨.
어떻게 추상화를 할까?
사람에 대한 속성과, 메서드는 아주 많을 것이다.
애플리케이션이 어떤 기능을 하는지에 따라 어떤 속성, 메서드를 택하는 지가 달라진다.
모델은 추상화를 통해 실제 사물을 '목적에 맞게' '단순하게' 묘사해야 한다.
모델링(추상화)은 객체 지향에서 클래스 설계 시, 데이터베이스 테이블 설계 시 필요한 기법이다.
추상화와 T메모리
애니메이션 쥐 캐릭터 관리 프로그램을 만든다. 추상화를 통해 관심 있는 특성만 쏙쏙 뽑아내었다.
위 클래스 다이어그램을 자바 코드로 변환하면 다음과 같다.
public class Mouse {
public String name;
public int age;
public int countOfTail;
public void sing() {
System.out.println(name + " 찍찍");
}
}
main() 메서드에서 객체를 생성해본다.
1 package abstractionOI;
2
3 public class MouseDriver {
4 public static void main(String[] args) {
5
6 Mouse mickey = new Mouse();
7 mickey .name = "미키";
8 mickey.age = 85;
9 mickey.countOfTail = 1;
10
11 mickey.sing();
12
13 mickey = null;
14
15 Mouse jerry = new Mouse();
16
17 jerry, name = "제리";
18 jerry.age = 73;
19 jerry.countOfTail = 1;
20
21 jerry. sing();
22 }
23 }
과정을 자세히 살펴보며 T메모리의 변화를 살펴본다.
초기 상태
- static 붙은 메서드 - main() : 클래스의 멤버 메서드 - UML 표기법에서 클래스멤버는 밑줄 표시
- sing() : 객체의 멤버 메서드 - UML에서 밑줄 x
Mouse mickey에 의해 Mouse 타입의 객체를 참조할 수 있는
객체 참조 변수 mickey가 T메모리의 스택 영역,
그 중에서도 main() 메서드 스택 프레임 안에 생성된다.
새로운 인스턴스 mickey를 생성해보자
5 Mouse mickey = new Mouse();
mickey의 속성을 부여해보자
Mouse mickey = new Mouse();
mickey .name = "미키";
mickey.age = 85;
mickey.countOfTail = 1;
이제 mickey 끝!
mickey = null;
해당 줄이 실행된 후에는 객체_참조_변수 mickey가 더이상 힙영역의 Mouse 객체를 참조하지 않는다.
그럼 누가 출동할까? ___ 가비지 컬렉터!___
아무도 참조해주지 않는 Mouse 객체를 쓰레기로 인지하고 수거해 간다.
클래스 멤버 vs 객체 멤버 = static 멤버 vs 인스턴스 멤버
쥐의 꼬리: 1개 / 미키마우스의 꼬리: 1개
Mouse 객체의 countOfTail 속성은 모두가 같은 값을 갖는다. <- Mouse의 객체 수 만큼 아까운 메모리를 잡아먹고 있다.
그럼 꼬리 개수를 고정하면 되지 않을까?
static <- 을 활용한다.
static 키워드와 함께 사용되는 것은 클래스 멤버이다.
이들은 T메모리의 stactic 영역에 상주하게 되므로 static(정적) 멤버라고도 한다.
객체 멤버들은 객체가 클래스의 인스턴스이므로 인스턴스 멤버라고도 한다.
UML 표기법에서 정적 멤버는 밑줄을 사용해 표시하도록 규정한다.
이름 | 다른 이름 | 사는 곳(T메모리) |
stactic 변수 | 클래스 [멤버] 속성, 정적 변수, 정적 속성.. | 스태틱 영역 |
인스턴스 변수 | 객체 [멤버] 속성, 객체 변수... | 힙 영역 |
local 변수 | 지역 변수 | 스택 영역(스택 프레임 내부) |
상속(extends): 재사용 + 확장
객체 지향에서의 상속이란?
상위 클래스의 특성을 하위클래스에서 상속하고, - 특성 상속
거기에 더해 필요한 특성을 추가, 즉 확장해서 사용할 수 있다는 의미다.
상속의 강력함
public class 동물 {
String myClass;
동물() {
myClass = "동물";
}
void showMe() {
System.out.println(myClass);
}
}
- 동물이라는 Class를 조류라는 Class가 상속함
public class 조류 extends 동물 {
조류() {
myClass = "조류";
}
}
- 동물의 메서드를 조류가 그대로 사용할 수 있는 모습임.
public static void main(String[] args) {
동물 animal = new 동물();
조류 bird = new 조류();
animal.showMe();
bird.showMe();
}
- 동물이라는 클래스에 하나로 다 묶일 수 있음
public static void main(String[] args) {
동물[] animal = new 동물[2];
animal[0] = new 동물;
animal[1] = new 조류;
for (int index = 0; index < animals.length; index++) {
animals[index].showMe();
}
}
상속의 특성
- 객체 지향의 상속은 상위 클래스의 특성을 재사용하는 것이다.
- 객체 지향의 상속은 상위 클래스의 특성을 확장하는 것이다.
- 객체 지향의 상속은 is a kind of 관계를 만족해야 한다.
다중상속과 자바
- 다중상속이란?
- 인어: 사람, 물고기를 상속 받음
- 그럼 인어는 메서드 swim() 에서 사람처럼 수영해야 할까, 물고기처럼 수영해야 할까?
- -> 다중 상속의 다이아몬드 문제 발생
- -> 득보다 '실'이 더 많음
- 따라서, 자바와 C#에서는 다중 상속을 없앴다.
- 그대신 '인터페이스'를 도입해 다중 상속의 득을 취하고 실은 과감히 버렸다.
상속과 인터페이스
- 인터페이스: be able to "무엇을 할 수 있는" 표현의 형태다.
- Class is able to 인터페이스
- 고래는 할 수 있다 헤엄치다
[ + ]
상위 클래스는 물려줄 특성이 풍성할수록 좋다.
인터페이스는 구현을 강제할 메서드의 개수가 적을수록 좋다.
상속과 T메모리
Penguin pororo = new Penguin( );
Animal pingu = new Penguin( );
- 펭귄 Class의 인스턴스 힙 영역에 생김 + 동물 Class의 인스턴스도 함께 힙 영역에 생김
- Pingu 객체 참조 변수가 가리키고 있는 것 -> 인스턴스 - 펭귄 X / 동물 O
'Development > CS' 카테고리의 다른 글
[스프링 입문을 위한 자바 객체지향의 원리와 이해] 3장. 자바와 객체지향(다형성, 캡슐화) (1) | 2025.03.07 |
---|---|
[JAVA - 면접 대비] 자바와 절차적/구조적 프로그래밍 (0) | 2025.02.14 |
[스프링 입문을 위한 자바 객체지향의 원리와 이해] 2장. 자바와 절차적/ 구조적 프로그래밍 (0) | 2025.02.12 |
[자료구조] 트라이(Trie) (0) | 2025.02.08 |
[면접을 위한 CS 전공 지식 노트] 5장. 자료구조 (0) | 2025.01.29 |