Java Object Oriented Programming(OOP, Class & Object)

OOP, Class & Object

java

참고서적 : Java의정석 3rd Edition

객체지향언어

객체지향이란? 실제 세계는 사물(객체)로 이루어져 있으며, 발생하는 모든 사건들은 사물간의 상호작용이다.

객체지향언어의 특징

코드의 재사용성이 높다.

  • 새로운 코드를 작성할 때 기존의 코드를 이용하여 쉽게 작성할 수 있다.

코드의 관리가 용이하다.

  • 코드간의 관계를 이용해서 적은 노력으로 쉽게 코드를 변경할 수 있다.

신뢰성이 높은 프로그래밍을 가능하게 한다.

  • 제어자와 메서드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록 하며, 코드의 중복을 제거하여 코드의 불일치로 인한 오동작을 방지할 수 있다.

클래스와 객체

클래스의 정의 => 클래스란 객체를 정의해 놓은 것이다.
클래스의 용도 => 클래스는 객체를 생성하는데 사용된다.

프로그래밍에서 객체란 클래스에 정의된 내용대로 메모리에 생성된 것을 뜻한다.

객체의 정의 => 실제로 존재하는 것, 사물 또는 개념
객체의 용도 => 객체가 가지고 있는 기능과 속성에 따라 다르다.

JDK(Java Development Kit)에서는 유용한 클래스를 기본적으로 제공하고 있다.

객체와 인스턴스

Instance란? 클래스로부터 객체를 만드는 과정이다.

객체의 구성요소 - 속성과 기능

Class로 부터 Object를 생성하면, Class에 정의된 Property(속성)과 Function(기능)을 가진 Object를 생성한다.

  • 객체를 생성하는 과정을 Instance화라고 한다.

Property(속성) = 멤버변수(variable)
Function(기능) = 메서드(method)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// TV를 예로 들면 
// TV의 속성 : color, power, channel ,size
// TV의 기능 : 켜기, 끄기, 볼륨높이기 볼륨낮추기, 채널 변경하기

class TV {
String color;
boolean power;
int channel;
int size;

void power(); // power는 boolean으로 on off를 결정하기 때문에 method가 1개면 된다.
void volumUp();
void volumDown();
void channelUp();
void channelDown();
}

Instance의 생성과 사용

위에서 생성한 TV Class로 Instance를 생성하는 방법이다.

1
2
3
TV t = new TV(); // TV Class의 Instance t라는 참조변수를 생성하였다.  

t.channel = 8; // 생성한 t의 channel에 8이라는 값을 저장한다.

생성된 t는 TV Class의 Property의 초기값으로 세팅되기에 값을 저장하기 위해서는 t.channel = 8 이렇게 하면 값이 저장된다.

Instance는 참조변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 Instance의 타입과 일치해야한다. (여러개의 참조변수를 생성 할 수 있다.)

생성된 Instance들의 Property의 값을 각각 다르게 저장할 수 있지만, Method는 동일하게 사용된다.

1
2
3
4
5
6
7
8
9
10
11
12
class TV {
~~
~~
}

class TVtest {
TV t1 = new TV();
TV t2 = new TV(); // 2개의 instance가 생성된다.

t2 = t1; // t1이 저장하고 있는 주소를 t2에 저장한다.

}

t2 = t1 t2가 t1의 주소를 가르키게 되서 t1을 property의 값을 변경하면 t2도 변경된다.
이때 t2가 가르키고 있던 원래 Instance는 참조변수가 하나도 없기 때문에 'Garbage Collector'에 의해서 자동적으로 메모리에서 제거된다.

하나의 Instance를 여러 개의 참조변수가 가리키는 경우는 가능하지만
여러 Instance를 하나의 참조변수가 가리키는 것은 불가능하다.

객체 배열

많은 수의 객체를 다룰때 객체 배열로 생성하여서 다룰수 있다.
이때 객체를 생성해서 꼭 객체 배열의 각 요소에 저장하는 것을 잊으면 안된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14

Tv tv1,tv2,tv3;

Tv[] tvArr = new Tv[3];

// case1
tvArr[0] = new Tv();
tvArr[1] = new Tv();
tvArr[2] = new Tv();

//case2

Tv[] tvArr = {new Tv(),new Tv(),new Tv() }

모든 배열이 그렇듯이 객체 배열도 같은 타입의 객체만 저장할 수 있다.
polymorphism을 배우고 나면 하나의 배열로 여러 종류의 객체를 다룰 수 있다.

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
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(); // 꼭! instance화를 해줘야한다.
tvArr[i].channel = i+10;
tvArr[i].channelUp();
System.out.println(tvArr[i].channel);
}
}

}

class Tv {
String color;
boolean power;
int channel;

void power() { power = !power; }
void channelUp() {channel++;}
void channelDown() {channel--;}

}

클래스의 또 다른 정의

  1. 변수 : 하나의 데이터를 저장할 수 있는 공간
  2. 배열 : 같은 종류의 여러 데이터를 하나의 집합으로 저장할 수 있는 공간
  3. 구조체 : 서로 관련된 여러 데이터를 type에 관계없이 하나의 집합으로 저장할 수 있는 공간
  4. 클래스 : 데이터와 함수의 결합(구조체 + 함수)

Java에서의 문자열은 char[]가 아닌 String class로 다룬다 그 이유로는 문자열과 문자열을 다루는데 필요한 함수들을 함께 묶기 위해서이다.

아래는 Time Class를 작성하는 코드이다.

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

public class Time {
private int hour;
private int minute;
private float second; // 1/100초까지 표현

public int getHour() {
return hour;
}
public void setHour(int hour) {
if(hour < 0 || hour > 23) return;
this.hour = hour;
}
public int getMinute() {
return minute;
}
public void setMinute(int minute) {
if(minute < 0 || minute > 59) return;
this.minute = minute;
}
public float getSecond() {
return second;
}
public void setSecond(float second) {
if(second < 0.0f || second > 59.99f) return;
this.second = second;
}


}

Share