객체지향언어의 역사
객체지향이론은 상속, 캡슐화, 추상화 개념을 중심으로 점차 구체적으로 발전되었으며 1060년대 중반에 객체지향이론을 프로그래밍언어에 적용한 시뮬라(Simula)라는 최초의 객체지향언어가 발생했다. 그 이후 1980년대 중반에 C++을 비록하여 여러 객체지향 언어가 발표되면서 1995년에 자바가 발표되고 1990년대 말에 인터넷의 발전과 함께 크게 유행하면서 객체지향언어는 프로그래밍의 주류로 자리 잡았다.
객체지향언어
- 코드의 재사용성이 높다.새로운 코드를 삭성할때 기존의 코드를 이용하여 쉽게 작성할 수 있다.
- 코드의 관리가 용이하다.코드간의 관계를 이용해서 적은 노력으로 쉽게 코드를 변경할 수 있다.
- 신뢰성이 높은 프로그래밍을 가능하게 한다.제어자와 메서드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록하며,
- 코드의 중복을 제거하여 코드의 불일치로 인한 오작동을 방지할 수 있다.
클래스와 객체
클래스의 정의 : 객체를 정의해 놓은 것이다.
클래스의 용도 : 클래스는 객체를 생성하는데 사용된다.
객체의 정의 : 실제로 존재하는 것. 사물 또는 개념
객체의 용도 : 객체가 가지고 있는 기능과 속성에 따라 다름
유형의 객체 : 책상, 의자, tv 컴퓨터
무형의 객체 : 수학공식, 프로그램의 에러와 같은 논리나 개념
클래스 | 객체 |
---|---|
제품 설계도 | 제품 |
TV 설계도 | TV |
붕어빵 기계 | 붕어빵 |
객체와 인스턴스
클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화라고 하며, 어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스라고 한다.
클래스 → 인스턴스(객체)
객체의 구성요소 - 속성과 기능
속성(property) : 멤버변수(member variable), 특성(attribute), 필드(field), 상태(state)
기능(function) : 메서드(method), 함수(function), 행위(behavior)
인스턴스의 생성과 사용
package object_oriented_programming;
class Tv {
//Tv의 속성(멤버변수)
String color;
boolean power;
int channel;
//Tv의 기능(메서드)
void power() {power = !power;}
void channelUp() {++channel;}
void ChannelDown() {--channel;}
}
class TvTest{
public static void main(String[] args) {
Tv t;
t = new Tv();
t.channel =7;
t.ChannelDown();
System.out.println("현재 채널은 "+t.channel+"입니다.");
}
}
//결과
현재 채널은 6입니다.
인스턴스는 참조변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치해야한다.
package object_oriented_programming;
public class TvTest2 {
public static void main(String[] args) {
Tv t1 = new Tv();
Tv t2 = new Tv();
System.out.println("t1의 channel값은 "+t1.channel+"입니다.");
System.out.println("t2의 channel값은 "+t2.channel+"입니다.");
t1.channel = 7;
System.out.println("t1의 채널을 7로 변경");
System.out.println("t1의 channel값은 "+t1.channel+"입니다.");
System.out.println("t2의 channel값은 "+t2.channel+"입니다.");
}
}
//결과
t1의 channel값은 0입니다.
t2의 channel값은 0입니다.
t1의 채널을 7로 변경
t1의 channel값은 7입니다.
t2의 channel값은 0입니다.
package object_oriented_programming;
public class Tvtest3 {
public static void main(String[] args) {
Tv t1 = new Tv();
Tv t2 = new Tv();
System.out.println("t1의 channel값은 "+t1.channel+"입니다.");
System.out.println("t2의 channel값은 "+t2.channel+"입니다.");
t2 = t1;
t1.channel = 7;
System.out.println("t1의 채널을 7로 변경");
System.out.println("t1의 channel값은 "+t1.channel+"입니다.");
System.out.println("t2의 channel값은 "+t2.channel+"입니다.");
}
}
//결과
t1의 channel값은 0입니다.
t2의 channel값은 0입니다.
t1의 채널을 7로 변경
t1의 channel값은 7입니다.
t2의 channel값은 7입니다.
객체 배열
package object_oriented_programming;
public class TvTest4 {
public static void main(String[] args) {
Tv[] tvArr = new Tv[3];
for(int i=0; i<tvArr.length; i++) {
tvArr[i] = new Tv();
tvArr[i].channel = i+10;
}
for(int i=0; i<tvArr.length; i++) {
tvArr[i].channelUp();
System.out.printf("tvArr[%d].channel=%d%n", i,tvArr[i].channel);
}
}
}
//결과
tvArr[0].channel=11
tvArr[1].channel=12
tvArr[2].channel=13
클래스의 또 다른 정의
- 변수 : 하나의 데이터를 저장할 수 있는 공간
- 배열 : 같은 종류의 여러 데이터를 하나의 집합으로 저장할 수 있는 공간
- 구조체 : 서로 관련된 여러 데이터를 종류에 관계없이 하나의 집합으로 저장할 수 있는 공간
- 클래스 : 데이터와 함수의 결합(구조체+함수)
package object_oriented_programming;
public class Time {
private int hour;
private int minute;
private float second;
public int getHour() {return hour;}
public int getMinute() {return minute;}
public float getsecond() {return second;}
public void setHour(int h) {
if(h < 0 || h > 23) return;
hour = h;
}
public void setMinute(int m) {
if(m < 0 || m > 59) return;
minute = m;
}
public void setSecond(float s) {
if(s < 0.0f || s > 59.99f) return;
second = s;
}
}
제어자를 통해 변수의 값을 직접 벼경하지 못하도록하고 대신 메서드를 통해서 값을 변경하는 get, set 메서드를 작성한다.
출처 : JAVA의 정석 - (남궁성지음)