티스토리 뷰

클래스와 객체

  • 클래스의 정의 : 객체를 정의해 놓은 것
  • 클래스의 용도 : 객체를 생성하는 용도로 사용
  • 객체의 정의 : 실제로 존재하는 것(사물/개념)
  • 객체의 용도 : 객체가 깆고 있는 속성과 기능에 따라 용도가 다름
  • 프로그래밍에서 객체란, 클래스에 정의된 내용대로 ‘메모리’에 생성된 것 
더보기

클래스와 객체

  • 클래스 : 객체 = 제품 설계도 : 제품(TV 설계도 : Tv)

 

객체의 구성요소

  • 객체 = 속성(변수) + 기능(메서드)
더보기

객체지향개념

  • HW(실제 세계) SW(=프로그램, 코드 만들기)

 

하드웨어를 '분석' & '관찰'하여 동영상 플레이어, 오디오 플레이어 등의 프로그램으로 만든다.

분석&관찰 결과, Tv라는 사물(객체)이 '속성'과 '기능'으로 표현할 수 있다.

 

객체 = 속성(변수) + 기능(메서드)

  • 객체는 속성과 기능으로 이루어져 있다.
  • 속성과 기능은 각각 ‘변수’와 ‘메서드’로 표현된다.

 

객체와 인스턴스

  • 객체 : 모든 인스턴스를 대표하는 일반적인 용어
  • 인스턴스 : 특정 클래스로부터 생성된 객체(예. Tv인스턴스)
  • 인스턴스화 : 클래스로부터 객체를 만드는 것(클래스를 작성했으면, 따로 제품을 만들어야 제품을 사용할 수 있다.)
더보기

인스턴스화 : 클래스로부터 객체를 만드는 것

 

자주 물어보는 질문 ❓

  • Q1. 클래스가 왜 필요한가?
  • Q2. 객체가 왜 필요한가?
  • Q3. 객체를 사용한다는 것은?
더보기

Q1. 클래스가 왜 필요한가?

A. 객체를 생성하기 위해

 

Q2. 객체가 왜 필요한가?

A. 객체를 사용하기 위해

 

Q3. 객체를 사용한다는 것은?

A. 객체가 가진 속성과 기능을 사용하는 것

 

객체의 생성과 사용

  1. 클래스 작성
  2. 객체 생성
  3. 객체 사용
더보기

1. 클래스 작성(설계도)

class Tv {    // Tv클래스 작성(설계도)
    String color;
    boolean power;
    int channel;
    
    void power()       { power = !power; }
    void channelUp()   { channel++; }
    void channelDown() { channel--; }
}

 

2. 객체의 생성(제품)

  1. 클래스의 객체를 참조하기 위한 참조변수 선언(리모컨)
  2. new연산자로 객체 '생성'
  3. 대입연산자(=)로 참조변수와 객체를 ‘연결’
/*
클래스명 변수명;          // 클래스의 객체를 참조하기 위한 참조변수 선언
변수명 = new 클래스명();  // 클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장
*/

Tv t;                    // Tv클래스 타입의 참조변수 t를 선언(Tv 리모콘)
t = new Tv();            // Tv인스턴스를 생성한 후, 생성된 Tv인스턴스의 주소를 t에 저장
/*
Tv t = new Tv();         // 위 두 문장을 한 줄로 표현 가능
*/
1. 객체의 생성 (1) 참조변수 선언 (2) 객체의 생성 (3) 대입연산자로 참조변수와 객체 연결

 

3. 객체의 사용

  • 객체의 속성기능을 사용한다.
  • 인스턴스의 멤버(변수, 메서드)를 사용한다.
  • 변수 사용 : 변수에 값 저장
  • 메서드 사용 : 메서드 호출
  • 인스턴스는 참조변수(리모컨)를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치해야 한다. ⭐
t.channel = 7;    // 변수 값 저장
t.channelDown();  // 메서드 사용(호출)
System.out.println("현재 채널은 " + t.channel + " 입니다.");

/*
t.xxx : 리모컨(참조변수)을 통해서만 객체를 사용할 수 있다.
*/
Ex6_1, 6_2 실습하기(객체마다 별도의 저장공간을 갖는다)

 

가비지 컬렉터

  • 자신을 참조하고 있는 참조변수가 하나도 없는 인스턴스는 더 이상 사용되어질 수 없으므로 ‘가비지 컬렉터(Garbage Collector)’에 의해서 자동적으로 메모리에서 제거된다.

 

예제6-1, 6-2

더보기

Ex6_1

Ex6_2

 

t2 = t1;

  • 참조변수 t1의 값을 t2에 저장

자신을 참조하는 참조변수가 하나도 존재하지 않는 객체는 '가비지 컬렉터'에 의해서 자동적으로 메모리에서 제거된다.

참조변수와 인스턴스의 관계

▲ 참조변수와 인스턴스의 관계 - (a) (b)
  • (a) 하나의 인스턴스를 여러 개의 참조변수가 가리키는 경우(가능)
  • (b) 여러 인스턴스를 하나의 참조변수가 가리키는 경우(불가능)

참조변수에는 하나의 값(주소)만이 저장될 수 있으므로 둘 이상의 참조변수가 하나의 인스턴스를 가리키는 것은 가능하지만, 하나의 참조변수로 여러 개의 인스턴스를 가리키는 것은 가능하지 않다.

 

객체 배열

  • 참조변수 배열
  • 배열의 각 요소에 객체의 주소값이 저장된다.
  • 객체를 생성해서 배열의 각 요소에 저장해야 한다.
더보기

참조변수 배열, 배열의 각 요소에 객체의 주소값이 저장된다.

Tv[] tvArr = new Tv[3];    // 길이가 3인 Tv타입의 참조변수 배열
객체 배열을 생성하는 것은, 그저 객체를 다루기 위한 참조변수들이 만들어진 것일 뿐, 아직 객체가 저장되지 않았다.

객체를 생성해서 배열의 각 요소에 저장해야 한다.

// 객체를 생성해서 배열의 각 요소에 저장
tvArr[0] = new Tv();
tvArr[1] = new Tv();
tvArr[2] = new Tv();

/* 위 과정을 한 줄로 표현할 수 있다.
Tv[] tvArr = { new Tv(), new Tv(), new Tv() }; 
*/
객체를 생성해서 객체 배열의 각 요소에 저장하는 것을 잊으면 안 된다.

 

클래스의 정의

  1. 설계도
  2. 데이터 + 함수
  3. 사용자정의 타입
더보기

2. 데이터 + 함수

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

3. 사용자정의 타입

  • 프로그래머가 서로 관련된 변수들을 묶어서 하나의 타입으로 새로 추가하는 것
  • 원하는 타입을 직접 만들 수 있다.
class Time {
	int hour;
	int minute;
	int second;
}
// 비객체지향적인 코드
int hour;    // 시간을 표현하기 위한 변수
int minute;  // 분을 표현하기 위한 변수
int second;  // 초를 표현하기 위한 변수, 1/100초까지 표현하기 위해 float로 했다.

int hour1, hour2, hour3;   
int minute1, minute2, minute3;  
int second1, second2, second3;

int[] hour = new int[3];   // 시간끼리
int[] minute = new int[3]; // 분끼리
int[] second = new int[3]; // 초끼리

하나의 시간을 구성하는 시, 분 ,초가 서로 분리되어 있기 때문에 프로그램 수행과정에서 시, 분, 초가 따로 뒤섞여서 올바르지 않은 데이터가 될 가능성이 있다. 이런 경우 시, 분, 초를 하나로 묶는 사용자정의 타입, 즉 클래스를 정의하여 사용해야 한다.

// 객체지향적 코드
Time t = new Time();

Time t1 = new Time();
Time t2 = new Time();
Time t3 = new Time();

Time[] t = new Time[3];
t[0] = new Time(); 
t[1] = new Time(); 
t[2] = new Time(); 

class Time {
    int hour;
    int minute;
    int second;
}
표6-2 비객체지향적 코드와 객체지향적 코드를 그림으로 비교(유튜브)

이제 시, 분, 초가 하나의 단위로 묶여서 다루어지기 때문에 다른 시간 데이터와 섞이는 일은 없겠지만, 시간 데이터에는 다음과 같은 추가적인 제약조건이 있다.이러한 조건들이 모두 프로그램 코드에 반영될 때, 보다 정확한 데이터를 유지할 수 있을 것이다. 객체지향언어가 아닌 언어에서는 이러한 추가적인 조건들을 반영하기가 어렵다. 그러나 객체지향언어에서는 제어자와 메서드를 이용해서 이러한 조건들을 코드에 쉽게 반영할 수 있다.

 

하나의 소스파일에 여러 클래스 작성

  1. 하나의 소스파일에는 하나의 클래스만 작성하는 것이 바람직하다.
  2. 클래스가 두 개 이상인 경우, main메서드가 있는 클래스의 이름과 소스파일의 이름이 일치해야 한다.
  3. public class가 있는 경우, 소스파일의 이름은 반드시 public class의 이름과 일치해야 한다.
  4. public class가 하나도 없는 경우, 소스파일의 이름은 'Hello2.java', 'Hello3.java' 둘 다 가능하다.
  5. 하나의 소스파일에 둘 이상의 public class가 존재하면 안 된다.
더보기

3. public class가 있는 경우, 소스파일의 이름은 반드시 public class의 이름과 일치해야 한다.

// Hello2.java
public class Hello2 {}
       class Hello3 {}

 

4. public class가 하나도 없는 경우, 소스파일의 이름은 'Hello2.java', 'Hello3.java' 둘 다 가능하다.

// Hello2.java
class Hello2 {}
class Hello3 {}

 

5.하나의 소스파일에 둘 이상의 public class가 존재하면 안 된다.

// Hello2.java
public class Hello2 {}
public class Hello3 {}
/*
각 클래스를 별도의 소스파일에 나눠서 저장하던가 아니면 둘 중의 한 클래스에 public을 붙이지 말아야 한다.
*/
// Hello3.java
public class Hello2 {}
       class Hello3 {}
/*
    소스파일의 이름이 public class의 이름과 일치하지 않으면 안 된다. 소스파일의 이름을 'Hello2.java'로 변경해야한다.
*/
// hello2.java
public class Hello2.java {}
       class Hello3.java {}
       
/*
    소스파일의 이름과 public class의 이름이 일치하지 않는다. 대소문자를 구분하므로 대소문자까지 일치해야 한다.
*/

 

main메서드가 있는 클래스 지정하는 방법

  • Run configuration > Main class: ______

 

 


🍪

📄 - 객체지향개념 암기노트 바로가기

'Java의 정석_기초편' 카테고리의 다른 글

오버로딩(overloading)과 오버라이딩(overriding)  (0) 2022.10.12
변수와 메서드  (0) 2022.10.11
객체지향 언어  (0) 2022.10.10
추상 클래스(abstract class)  (0) 2022.10.09
다형성(polymorphism)  (0) 2022.10.07
댓글
공지사항