1. 객체지향언어
1.1 객체지향언어의 역사
- 과학자들의 모의실험을 위해 실제 세계와 유사한 가상 세계를 컴퓨터 속에 구현하고자 하는 노력
- 기본 개념 : 실제 세계는 사물(객체)로 이루어져 있으며, 발생하는 모든 사건들은 사물간의 상호작용이다.
- 초창기에는 주목받지 못했으나, 1995년 자바의 발표와 1990년대 인터넷의 발전과 유행
1.2 객체지향언어

- 객체지향의 개념을 이해한 것과 객체지향적인 코드를 작성하는 것은 다르다. 처음부터 거시적으로 객체지향적으로 프로그래밍하는 것보단, 기능을 먼저 완성해보고 점차 개선해 나가는 것이 좋다.
2. 클래스와 객체
2.1 클래스와 객체의 정의와 용도


- 프로그래밍에서 객체는 클래스에 정의된 내용대로 메모리에 생성된 것을 뜻한다.
- 예시
- TV 설계도(클래스)
- TV (객체)
- 클래스는 단지 객체를 생성하는데 사용될 뿐, 객체 그 자체는 아니다
2.2 객체와 인스턴스
- 클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화 하고 한다.
- 어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스라고 한다.
- Tv 클래스로부터 만든 객체를 Tv 클래스의 인스턴스라고 한다
- 인스턴스와 객체는 같은 의미이지만, 객체는 모든 인스턴스를 대표하는 포괄적 의미를 가진다.
2.3 객체의 구성요소 - 속성과 기능

- 객체는 속성과 기능의 집합이다.
- 클래스란 객체를 정의한 것이므로, 클래스로부터 객체를생성하면 클래스의 정의된 속성과 기능을 가진 객체가 만들어진다.
- Ex) TV

- 위를 토대로 Tv 클래스를 만들어보면 다음과 같다

2.4 인스턴스의 생성과 사용
- Tv 클래스를 선언 = 설계도를 작성한 것에 불과, Tv 인스턴스를 생성해야 제품을 사용할 수 있다.
클래스명 변수명;
변수명 = new 클래스명();
Tv t;
t = new Tv()
예제 6-1
lass Tv {
String color;
boolean power;
int channel;
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 + "입니다");
}
}
과정
- Tv t;
- Tv 클래스 타입의 참조변수 t를 선언한다. 메모리에 참조변수 t를 위한 공간이 마련된다. 아직 인스턴스가 생성되지 않았으므로 참조변수로 아무것도 못한다
- 참조변수 t
- t = new Tv();
- 연산자 new에 의해 Tv 클래스의 인스턴스가 메모리의 빈 공간에 생성
- 멤버변수 - 각 자료형에 해당하는 기본값으로 초기화
- 대입 연산자에 의해서 객체의 주소값이 참조변수 t에 저장
- 이제 참조변수 t를 통해 Tv 인스턴스에 접근가능

3. t.channel = 7;
- 참조변수 t에 저장된 주소에 있는 멤버변수 channel 에 7을 저장한다.

4. t.channelDown();
- 참조변수 t가 참조하고 있는 Tv인스턴스의 channelDown 메서드를 호출한다.
- 저장되어 있는 channel값을 1 감소시킨다.


2.5 객체 배열
- 많은 수의 객체를 다루어야 할 때, 배열로 다루면 편리하다.
Tv tv1, tv2, tv3 ; -> Tv[] tvArr = new Tv[3];
- 이 배열은 객체를 다루기 위한 참조변수들이 만들어진 것일뿐, 객체가 저장되지 않았다.
TvArr[0] = new Tv();
TvArr[1] = new Tv();
TvArr[2] = new Tv();
//OR 한번에 선언할 수 있다
Tv[] Arr = {new Tv(), new Tv(), new Tv()};
//OR 객체의 수가 너무 많다면
Tv[] tvArr = new Tv[100];
for(int i = 0; i < 100; i++) tvArr[i] = new Tv();
2.6 클래스의 또 다른 정의
- 클래스는 속성과 기능으로 정의되어 있다.
1. 클래스 - 데이터와 함수의 경합

- 그동안 데이터와 함수가 관계가 없는 것처럼 따로 다루어져 왔지만, 함수는 주로 데이터로 작업을 하기 때문에 관계가 깊다
- 따라서 자바와 같은 객체지향언어에서는 변수(데이터)와 함수를 하나의 클래스에 정의했다.
- C언어에서는 문자열을 문자배열로 다루지만, 자바에서는 문자열 함수를 함께 묶기위해 String class로 다룬다
2. 클래스 - 사용자정의 타입(user - defined type)
- 사용자 정의 타입 : 프로그래밍언어에서 제공하는 자료형 외에 프로그래머가 직접 하나의 타입을 추가하는 것
- Time 예시
- 비객체지향적 코드
int hour1, hour2, hour3; int minute1, minute2, minute3; float second1, second2, second3; // int[] hour = new int[3]; int[] minute = new int[3]; float[] second = new float[3];- 객체지향적 코드
class Time{ int hour; int minute; int second; } Time[] t = new Time[3]; t[0] = new Time(); t[1] = new Time(); t[2] = new Time(); - 시, 분, 초가 하나의 단위로 묶여서 움직이지만, 다음과 같은 추가적인 제약조건이 있다

- 객체지향적이지 않은 언어에서는 이러한 추가조건들을 반영하기 어렵다
- 다음과 같은 제어자를 통해 코드에 쉽게 반영할 수 있다(참고)
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 || s > 59) return;
second = s;
}
'Java > Java 스터디' 카테고리의 다른 글
| Chapter 06. 객체지향 프로그래밍 I (part 4~6) (1) | 2023.03.13 |
|---|---|
| Chapter 06. 객체지향 프로그래밍 I (part 3) (1) | 2023.02.22 |
| Chapter 05. 배열 (0) | 2023.02.15 |
| Chapter 04. 조건문과 반복문 (0) | 2023.02.15 |
| Chapter 03. 연산자 (0) | 2023.01.29 |