[객체 지향 프로그래밍] 개념 및 클래스와 객체

sy·2023년 7월 1일
0

객체 지향 언어

객체 지향 이론의 기본 개념

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

  • 객체 지향 이론은 상속, 캡슐화, 추상화 개념을 중심으로 점차 구체적으로 발전 되었다.
  • 기존의 프로그래밍언어와 전혀 다른 것이 아니라, 기존의 프로그래밍 언어에 몇 가지 새로운 규칙을 추가한 보다 발전된 형태의 것이다.

특징

1. 코드의 재사용성이 높다.
   새로운 코드를 작성할 때 기존의 코드를 이용하여 쉽게 작성할 수 있다.
2. 코드의 관리가 용이하다.
   코드간의 관계를 이용해서 적은 노력으로 쉽게 코드를 변경할 수 있다.
3. 신뢰성이 높은 프로그래밍을 가능하게 한다.
   제어자와 메서드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록 하며, 코드의 중복을 제거하여 코드의 불일치로 인한 오동작을 방지할 수 있다.

클래스와 객체

클래스
  객체를 정의해 놓은 것, 객체의 설계도 또는 틀
  객체를 생성하는데 사용

객체
  실제로 존재하는 것. 사물 또는 개념
  객체가 가지고 있는 기능과 속성에 따라 다름

📌 프로그래밍에서의 객체는 클래스에 정의된 내용대로 메모리에 생성된 것

예) 클래스는 붕어빵 틀, 객체는 붕어빵
클래스는 TV 설계도, 객체는 TV

객체와 인스턴스

클래스의 인스턴스화: 클래스로부터 객체를 만드는 과정
인스턴스: 어떤 클래스로부터 만들어진 객체
클래스 -----> 인스턴스 (객체)

객체의 구성 요소

  • 속성
  • 기능

✔ 객체는 속성과 기능의 집합
✔ 클래스란 객체를 정의한 것이므로 객체의 모든 속성과 기능이 정의 되어 있다.

✔ 속성 (property)
  멤버변수(member variable), 특성(attribute), 필드(field), 상태(state)
✔ 기능 (function)
  메서드(method), 함수(function), 행위(behavior)

예) TV
속성: 크기, 길이, 높이, 색상, 볼륨 채널 등
기능: 켜기, 끄기, 불륨 높이기, 낮추기, 채널 변경하기 등

TV 클래스 만들어보기

/* 객체를 정의한 것이므로 객체의 모든 속성과 기능 정의 */
// 클래스는 TV 설계도
class TV {
// 속성 - 변수
String color;
boolean power;
int channel;

// 기능 - 메서드 
void power() {
	power = !power
}
void channelUp() {
	channel++;
}
void channelDown() {
	channel--;
}

TV 인스턴스 생성하기

class TvTest {
	public static void main(String[] args) {
    	TV tv; 				// TV 인스턴스를 참조하기 위한 변수
        tv = new TV(); 		// 인스턴스 생성
        tv.channel = 7; 	// 인스턴스의 멤버변수 channel 값
        tv.channelDown(); 	// 인스턴스의 메서드 호출
        System.out.println(tv.channel); // 현재 채널은 6
        
        Tv tv2;
        tv2 = new TV();
        System.out.println(tv2.channel); // tv2의 현재 채널은 0 (기본값)
       
        tv2 = tv1; // 주소를 연결하는것!!
        System.out.println(tv2.channel); // tv2 채널은 6 이 됨
    }
}

⭐ 하나씩 뜯어보기 ⭐

  1. TV tv;
    TV 클래스 타입의 참조변수 선언. 메모리에 참조 변수 tv를 위한 공간 생성. 인스턴스가 생성되지 않았으므로 참조 변수로 아무 것도 할 수 없음

  2. tv = new TV();
    연산자 new에 의해 인스턴스가 메모리의 빈 공간에 생성.
    멤버변수는 각 자료형에 해당하는 기본값으로 초기화 됨

    대입연산자(=)에 의해 생성된 객체의 주소값이 참조변수 tv에 저장
    인스턴스를 다루기 위해서는 참조변수가 반드시 필요

  3. tv.channel = 7;
    참조변수 tv에 저장된 주소에 있는 인스턴스의 멤버 변수 channel에 7 저장

  4. tv.channelDown();
    참조변수 tv가 참조하고 있는 TV 인스턴스의 channelDown 메서드 호출
    channel은 7 -> 6

  5. Tv tv2; tv2 = new TV();
    1~2와 똑같이 tv2 라는 변수로 TV 인스턴스를 생성

  1. tv2 = tv1
    tv1이 저장하고 있는 주소를 tv2에 저장하는 것
  1. tv2.channel
    주소를 저장했기 때문에 tv2의 채널은 6

인스턴스는 참조변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치 해야 한다.

객체 배열

많은 수의 객체를 다뤄야할 때, 배열로 다루면 편리하다. 객체도 배열로 다루는 것을 객체 배열이라 한다. 객체 배열 안에는 객체의 주소가 저장 된다.

TV[] tvArr = new TV[3]; // 참조변수 배열 생성 

// 초기화 필수!! 3가지 방법
tvArr[0] = new TV();
tvArr[1] = new TV();
tvArr[2] = new TV();
// or
Tv[] tvArr = { new TV(), new TV(), new TV() };
// or
for (int i = 0; i < tvArr.length; i++) {
	tvArr[i] = new TV();
}

프로그래밍적인 관점에서의 클래스

위에는 객체지향이론의 관점에서의 클래스 정의

1. 클래스 - 데이터와 함수의 결합

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

하나의 데이터를 저장하기 위해 변수를 -> 같은 종류의 데이터를 보다 효율적으로 다루기 위해 배열을 -> 구조체(structure)가 등장하여 자료형의 종류에 상관 없이 서로 관계가 깊은 변수들을 하나로 묶어서 다룸

자바와 같은 객체지향언어에서는 변수(데이터)와 함수를 하나의 클래스에 정의하여 서로 관계 깊은 변수와 함수들을 함께 다룬다. 클래스는 서로 관련된 변수들을 정의하고 이들에 대한 작업을 수행하는 함수들을 함께 정의한다.

2. 클래스 - 사용자정의 타입

프로그래머가 서로 관련된 변수들을 묶어서 하나의 타입으로 새로 추가하는 것을 사용자정의 타입이라고 한다.

사용자 정의 클래스

class Time {
	int hour;
	int minute;
    float second;
}
비객체지향적 코드 객체지향적 코드
int hour1, hour2;
int minute1, minute2;
float second1, second2
Time t1 = new Time();
Time t2 = new Time();

💡 객체 지향개념을 학습 할 때 재사용성유지보수, 중복된 코드의 제거 이 세 가지 관점에서 보면 보다 쉽게 이해 할 수 있을 것

0개의 댓글