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