1. 객체(Object)와 클래스(Class)
1
2
3
4
5
6
7
8
|
//코드 예시
//클래스 선언 class Animal{ int idx;
String name:
int age;
void eat();
void move();
}
|
|
가. 객체
우리 주위에 있는 모든 것 EX) 컴퓨터, 건물, 사람 등
객체들은 고유 특성과 행동을 가지고, 또 다른 객체들에게 행동을 요청하거나 정보를 주고받는 등의 상호작용이 일어남
프로그램에서의 객체:: 클래스가 데이터 타입으로 메모리에 생성된 것
> 클래스 모양 그대로 생성된 실체 > 클래스의 인스턴스
나. 클래스
객체의 캡슐 > 객체를 만들어내기 위한 설계도/틀
필드(field: 멤버 변수)와 메소드(method: 멤버 함수)로 구성됨
2. 객체지향언어
- 객체를 프로그램 내에 표현하기 위한 언어
- 특징
- 추상화(Abstraction)
- 캡슐화(Encapsulation)
- 정보은닉(Information Hiding)
- 상속(Inheritance)
- 다형성(Polymorphism)
- 장점
- 재사용성 高 > 생산성 향상
- 상속, 캡슐화, 다형성으로 재사용성을 높임
- 신뢰성 높은 프로그래밍
- 보안 우수
- 유지보수 우수
- 재사용성 高 > 생산성 향상
- 단점
- 절차지향에 비해 실행 속도 低
- 설계에 많은 시간 소요
3. 추상화(Abstraction)
객체의 공통적인 속성, 기능을 추출하여 정의/선언하는 것
실제의 객체들을 프로그램으로 정의하기 위해 공통적인 특성을 파악하여 정의하거나 제거하는 과정
> 클래스를 생성하는 것도 일종의 추상화
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
//Cat 클래스
class Cat{
String name;
int age;
int color;
Cat(String name, int age, int color){
this.name = name;
this.age = age;
this.color = color;
}
void sound(){
System.out.println("야옹");
}
void walk(){
System.out.println("냥냥 살금살금");
}
}
|
cs |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
//Dog 클래스
class Dog{
String name;
int age;
int color;
Dog(String name, int age, int color){
this.name = name;
this.age = age;
this.color = color;
}
void sound(){
System.out.println("멍멍");
}
void walk(){
System.out.println("멍멍 성큼성큼");
}
}
|
cs |
위의 Cat 클래스와 Dog 클래스는 공통되는 것들이 많음
> 공통되는 부분들을 class Animal을 정의하여 따로 관리할 수 있음
> 이 과정이 추상화
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
//Animal 클래스
class Animal{
String name;
int age;
int color;
Animal(String name, int age, int color){
this.name = name;
this.age = age;
this.color = color;
}
void sound(){
System.out.println("동물이 운다");
}
void walk(){
System.out.println("동물이 걷는다");
}
}
|
cs |
4. 캡슐화(Encapsulation)
객체를 클래스로 설계해 내부를 보호하고 , 외부에서 내부를 볼 수 없게 하는 것
정보 은닉(Information Hiding): 외부로부터 내부 클래스의 정보를 보호
캡슐을 생각 > 캡슐에 든 약은 어떤 색인지, 어떤 성분인지 외부에서는 알 수 없음
객체는 캡슐화가 원칙이지만, 외부와의 상호작용을 위해 몇 부분은 공개노출(예. TV 리모콘의 On/Off 버튼, 채널 버튼, 음량 버튼 등)
> 변수는 private 접근 설정, 공개 메서드를 통해 접근 통로 마련(setter/getter)
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
|
//Animal 클래스
class Animal{
private String name;
private int age;
private int color;
Animal(String name, int age, int color){
this.name = name;
this.age = age;
this.color = color;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}
public void sound(){
System.out.println("동물이 운다");
}
public void walk(){
System.out.println("동물이 걷는다");
}
}
|
cs |
위의 예시를 보면, Animal 클래스의 멤버 변수::name, age, color는 private으로 클래스 내부에서만 참조할 수 있게 설계됨
+ 외부에서도 동물의 이름(name)에 접근할 수 있도록, setName(String name), getName()함수를 선언함
5. 상속(Inheritance)
부모(상위 개체)의 속성을 자식(하위 객체)가 물려받아 자식이 부모의 특성을 모두 가지고 있는 것
상위 개체 클래스는 부모(parent class) / 슈퍼(super class) 클래스
하위 개체 클래스는 자식(child class) / 서브(sub class) 클래스
extends 키워드 사용 (이름 extends 부모 클래스 이름)
위의 Animal 클래스를 상속받아 Dog 클래스 정의
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class Dog extends Animal{
private boolean alive; //Dog만의 멤버 변수 추가
Dog(String name, int age, int color, boolean alive){
super(name, age, color);
this.alive = alive;
}
public void jump(){ //Dog 만의 멤버
System.out.println("멍멍 점프!");
}
}
|
cs |
코드에는 Animal 클래스의 필드/메소드가 없지만, Animal 클래스를 상속받았기 때문에 서브 클래스 Dog 객체는 슈퍼 클래스의 멤버와 서브 클래스의 멤버를 모두 가짐
- is a 관계
- 자식 is a 부모 == 자식은 부모 타입
- has a 관계
- 일반적인 포함관계로, 상속 이외에 클래스를 재활용하는 방법
- 2개 이상의 클래스에서 특성을 가져올 때 하나는 상속, 하나는 멤버변수로 처리
- 단일 상속
- 다중 상속: 여러 클래스의 기능을 물려받을 수 있지만 관계 매우 복잡
- 자바는 단일 상속만 지원 > interface와 has a 관계로 단일 상속 단점 극복 가능
- super 키워드
- super로 조상 클래스 멤버 접근
- super.walk()
- super( ): 조상 클래스 생성자 호출, 클래스 생성자 첫 줄에서만 사용 가능, this()와 동시 사용은 불가
6. 다형성(Polymorphism)
같은 이름의 메소드가 클래스/객체에 따라 다르게 동작되도록 구현하는 것(주로 상속에서 발생)
- 오버라이딩(Overriding)
- 슈퍼 클래스에서 구현된 메소드를 서브 클래스에서 동일한 이름으로 자신의 특징에 맞게 다시 구현
- 아쉬운 기능에 +α를 하기 위해 사용
- 조건:: 메서드 이름 일치, 매개변수 개수 일치, 매개변수 타입 일치 , 매개변수 순서 일치 , 리턴 타입 일치, 접근 제한자 >= 부모, 조상보다 큰 예외 불가
- sound(), walk()함수 오버라이딩
12345678910111213141516171819202122class Dog extends Animal{private boolean alive; //Dog만의 멤버 변수 추가Dog(String name, int age, int color, boolean alive){super(name, age, color);this.alive = alive;}@Overridepublic void sound(){System.out.println("멍멍");}@Overridepublic void walk(){System.out.println("멍멍 성큼성큼");}public void jump(){ //Dog 만의 멤버System.out.println("멍멍 점프!");}}cs - 오버로딩(Overloading)
- 클래스 내에서 이름이 같지만 서로 다르게 동작하는 메소드를 여러개 구현
- 조건:: 이름 일치, 매개변수 타입/개수 불일치 (리턴타입만 불일치인 경우는 오버로딩X)
- walk()함수 오버로딩
1234567891011121314151617181920212223242526class Dog extends Animal{private boolean alive; //Dog만의 멤버 변수 추가Dog(String name, int age, int color, boolean alive){super(name, age, color);this.alive = alive;}@Overridepublic void sound(){System.out.println("멍멍");}@Overridepublic void walk(){System.out.println("멍멍 성큼성큼");}public void jump(){ //Dog 만의 멤버System.out.println("멍멍 점프!");}public void walk(String walkSound){ //walk 함수 오버로딩System.out.println(walkSound);}}cs
참고
황기대·김효수, 명품 Java Programing(개정 3판) ((주)생능출판사, 2017)
'Computer Science > Java' 카테고리의 다른 글
[Java] 자료형(기본형/참조형/클래스) (0) | 2021.12.09 |
---|---|
[Java] 개요(등장배경/실행과정/특징/장단점) (0) | 2021.12.06 |
댓글