객체지향 프로그래밍(Object Oriented Programming)
<< Object Oriented Programming-OOP >>
절차지향 프로그래밍, 구조적 프로그래밍
ex) C 프로그래밍
- 일을 처리하는 순서와 과정을 프로그래밍으로 구현
- Procedure, Process 를 중시함
- 순서, 과정이 달라지면 새로운 작업 모델이 필요함
- 재사용성이 불가능
반면...
OOP(객체지향 프로그래밍)는
- 프로세스 중심이 아닌 객체 중심으로 프로그래밍 하는 것.
- 재사용성이 뛰어남. 모듈화. 확장성..
□ Object Oriented Programming
: 인간의 현실세계를 프로그램에 반영한 것.
즉, 현실세계에 존재하는 객체(object-물건, 물체)를 프로그램에 반영한 것.
1) Object : 물건, 물체를 의미, 유 무형의 물체
ex) 자전거, 컴퓨터, 책상, 집, 정치, 윤리, 사회, 공기 ....
2) 이러한 객체-object의 특징으로는
속성(attribute)과 행위(behavior)를 갖는다는 것.
...따라서 프로그램에 객체를 반영할 때는 먼저 속성과 행위를 뽑아내는 과정이 필요
-> 이를 객체 모델링이라 한다.
◆ OOP의 주요 특징
1) 추상화-Abstraction
2) 은닉화-Encapsulation(캡슐화)
3) 다형성-Polymorphism
4) 상속성-Inheritance
1) 추상화(Abstraction)란?
...어떤 물체(object)에서 주된 특징을 부각시켜 표현하고, 나머지 부분은 과감하게 생략하는 것
OOP에서 사용되는 추상화도 이와 비슷하다.
한 물체를 대표하는 속성(명사)과 기능(동사)를 추출해내는 것을 프로그래밍에서는 추상화라고 한다.
ex) 집을 프로그래밍으로 추상화해보면...
House
|-속성(attribute): 방수, 주인이름, 지붕색...
+-행위(behavior) : 세를 놓다. 수리하다. 청소하다. 사다. 팔다....
위의 속성은 멤버변수로...
행위 또는 기능은 메소드로 표현한다.
위의 집이란 객체를 자바 프로그램에 추상화해보면
class House
{ //...속성...멤버변수: "has a" 관계를 갖는다.
int room;
String ownerName;
String addr;
public void existAt(String addr){
System.out.println(addr+"에 위치하다");
}
}
class HouseTest {
public static void main(String args[]) {
House h=new House();
h.existAt("300번지");
House h2=new House();
h2.existAt("100번지");
}
}////////////////////////////
2) 은닉화(Encapsulation)
- Data를 캡슐화하되
- Data에 접근할 때는 메소드로 접근하도록 한다.
○ 캡슐화 방법
ㄱ) 멤버 변수 앞에 private 접근 지정자를 붙인다.
private 지정자는 자기 클래스에서만 접근 가능한 접근지정자이다.(access modifier);
ex) private String name;
ㄴ) 멤버 변수에 값을 할당하고 값을 꺼내올 수 있는 메소드를 만든다.
- setter/getter메소드.
- 메소드의 접근 지정자는 public으로 주고
- setter 메소드들은 반환타입은 없되, 매개변수를 받아들이도록
- setter 메소드의 역할은 매개변수의 값을 멤버변수에 할당하는 일.
ex) public void setName(String n) {
name=n;
}
- getter메소드들은 반환타입이 있되 매개변수는 받아들이지 않는다.
- getter메소드의 역할: 멤버변수 값을 반환해주는 일
ex) public String getName() {
return name;
}
3) 다형성(Polymorphism)
○ 오버로딩(Overloading) - 다중정의, 중복정의
○ 오버라이딩(Overriding) - 재정의
□ 오버로딩(Overloading) - 다중정의, 중복정의
(기존방식-절차중심)
밀크커피- void getMilkCoffee (int cf, int s, int cr)
블랙커피- void getBlackCoffee (int cf)
프림커피- void getCreamCoffee (int cf, int cr)
(OOP방식 - 오버로딩)
void getTea (int cf, int su, int cr) - 밀크커피
String getTea (int cf) - 블랙커피 [o, 반환타입은 신경안씀]
void getTea (int cf, int cr) - 프림커피
void getTea (int cf, int sugar) - 설탕커피[x, 프림커피와 중복됨]
void getTea (Yuja y) - ○, 블랙커피와 데이터형이 다름
==> 오버로딩(중복정의,다중정의)
: 메소드 이름을 동일하게 주되,
매개변수의 데이터 타입과 갯수, 순서를 다르게 주어 구성하는 것.
***오버로딩의 조건***
1) 오버로딩하려는 메소드 이름이 같아야 한다.
2) 메소드의 매개변수의 데이터타입이 다르거나, 갯수가 다르거나 순서가 달라야 한다.
3) 메소드의 반환타입은 신경 안써도 된다 (같아도 되고 달라도 됨)
□ 오버로딩의 종류
i) 생성자 오버로딩
ii) 메소드 오버로딩
I ) 생성자 오버로딩
○ 생성자란?
: 객체가 생성될 때 최초로 실행되는 메소드를 의미.
○ 생성자 구성시 유의할 점
a) 생성자 이름은 클래스명과 동일하게
b) 반환타입을 가져선 안된다.
c) 생성자의 접근지정자로는 public, protected, 생략형,private 모두 가능하나,
대부분 public속성을 많이 준다.
cf) Math 클래스의 경우 생성자에 private 지정자를 두고 있다.
○ 생성자의 주요 역할 : 멤버 변수를 초기화 하는 일
○ 사용자가 생성자를 구현하지 않았을 경우
-->컴파일러는 default 생성자를 제공해줌
※ 그러나 사용자가 생성자를 하나라도 구현했다면, 그 때는 컴파일러가 제공 해주는 기본 생성자는 사라진다.
- 자바에서는 생성자를 다양하게 오버로딩 함으로써 다양한 초기값을 부여하고 있다.
○ 생성자 안에서 this()의 사용
- this()는 자기 자신의 생성자를 호출하는 메소드
- 한 클래스 안에 여러 개의 생성자가 오버로딩된 형태로 존재하고,
그 기능이 유사할 때, this라는 키워드를 이용해서 자기 자신의 다른 생성자를 호출할 수 있다.
- 이 때 주의할 점...
ㄱ) this()는 생성자 안에서만 호출해야 한다.
ㄴ) this()를 호출할 때는 반드시 생성자의 첫 번째 문장이어야 한다.
ㄷ) 또한 생성자 안에서 this()와 super()를 함께 쓸 수 없다.
※ this 의 사용(정리)******************************
1) this.변수 : 자기 클래스의 멤버변수(인스턴스 변수)를 접근할 때 사용
2) this.메소드: 자기 클래스의 멤버 메소드를 접근할 때 사용
3) this() : 자기 자신의 생성자 호출 시 사용
*** this 라는 키워드는 static 메소드 안에서는 사용할 수 없다.
**************************************************
□ 오버라이딩(Overriding)
...상속 개념과 맞물려 사용 부모로부터 상속 받은 메소드를 재정의해서 사용하는 것
: 재정의
**오버라이딩 조건******************
- 오버라이드 하려는 메소드가 부모 클래스에 존재해야 한다.
- 메소드 이름이 동일해야 한다.
- 메소드의 매개변수 갯수, 데이터타입이 같아야 한다.
- 메소드의 반환타입도 같아야 한다.
- 메소드의 접근 지정자는 부모클래스와 동일하거나, 접근 범위가 넓어야 한다.
- Exception의 경우 부모 클래스의 메소드와 동일하거나 더 구체적인 Exception을
발생시켜야 한다.
4) 상속성(Inheritance)
: 기존 클래스에 작은 기능이나 특성을 추가하여 새로운 클래스로 만드는 것을 의미.
즉 부모클래스를 만들고, 그 부모클래스에 있는 속성과 기능을 자식클래스에서 상속받아,
새로운 기능과 속성을 추가하는 것.
-상속 개념을 적용함으로써 개발시간 단축, 재사용성 등에 놀라운 장점이 있다.
-------------+ +--------------+
Person | |Student |
-------------+ <----+--------------+
-name: String| | - subject |
-age : int | | : String |
-------------+ +--------------+
|
|
-------------+ 상속관계는 "is a" 관계가
Staff | 성립할 때 맺을 수 있다.
-------------+ ex) Student is a Person
-dept: String| Staff is a Person
| Teacher is a Person
-------------+
**자바에서 상속을 받을 때는 extends 란 키워드를 사용한다.
자바는 단일 상속 개념이므로 extends 로 상속 받을 수 있는 클래스는 단 하나뿐이다.
/////////////////////////////////////////////
※ super 의 사용(정리)*****************************
1) super.변수 : 부모클래스로부터 물려받은 변수
2) super.메소드: " " 메소드
3) super() : 부모클래스의 생성자
..super()역시 생성자 안에서만 호출 가능하며, 생성자의 맨 첫줄에 위치 해야 한다.
super 라는 키워드도 static 메소드 안에서 사용 불가.
super() 는 부모클래스에 생성자가 오버로딩된 형태로 여러 개 존재할 때 그 중에서
어떤 생성자를 호출할 지 결정할 수 있다.
**그러나 super()생성자를 사용자가 명시적으로 호출하지 않는다면, 컴파일러는 자식클래스
생성자에서 super()의 디폴트 생성자를 자동으로 호출한다.
----------------------------------------
ex)
class Parent {
String name;
public Parent(String n) {
name=n;
}//인자 생성자----
}//////////////////
class Son extends Parent {
public Son() {
super("아무개"); //만일 이 문장이 없다면 에러발생
}//--------- //컴파일러가 super()를 자동호출 하므로...
}////////////////////
**************************************************
[실습문제]
좌표를 나타내는 MyPoint클래스를 설계해보자.
1. 클래스이름: MyPoint
2. 멤버변수: x, y좌표를 기억시킬 변수
3. 2의 멤버변수를 캡슐화한다.
4. 캡슐화한 변수에 접근할 set/get계열 메소드를 구성한다.
5. MyPoint클래스의 생성자를 구성한다.
...3가지 형태로 오버로딩해보자.
6. this()를 이용해서 멤버변수 값을 초기화하자.
7. 메소드 구성:
1) MyPoint클래스의 x, y좌표값을 증가 감소시켜주는 메소드
2) x와 y값이 같은지를 비교하는 메소드를 구성해보자.
8. main()메소드를 갖는 PointTest클래스를 만들어
MyPoint객체 생성해 자기가 구성한 메소드를 호출해보자.
/////////////////////////////////////////////
'Java' 카테고리의 다른 글
예외 처리(Exception) (0) | 2011.11.30 |
---|---|
String 클래스의 주요 메서드 정리 (0) | 2011.11.30 |
다형성(Polymorphism) (0) | 2011.11.30 |
인터페이스(Interface) (0) | 2011.11.30 |
추상(Abstract) 클래스 (0) | 2011.11.30 |