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

객체의 구성요소
- 객체 = 속성(변수) + 기능(메서드)
객체지향개념
- HW(실제 세계) → SW化(=프로그램, 코드 만들기)


하드웨어를 '분석' & '관찰'하여 동영상 플레이어, 오디오 플레이어 등의 프로그램으로 만든다.
분석&관찰 결과, Tv라는 사물(객체)이 '속성'과 '기능'으로 표현할 수 있다.
객체 = 속성(변수) + 기능(메서드)
- 객체는 속성과 기능으로 이루어져 있다.
- 속성과 기능은 각각 ‘변수’와 ‘메서드’로 표현된다.
객체와 인스턴스
- 객체 : 모든 인스턴스를 대표하는 일반적인 용어
- 인스턴스 : 특정 클래스로부터 생성된 객체(예. Tv인스턴스)
- 인스턴스화 : 클래스로부터 객체를 만드는 것(클래스를 작성했으면, 따로 제품을 만들어야 제품을 사용할 수 있다.)
인스턴스화 : 클래스로부터 객체를 만드는 것

자주 물어보는 질문 ❓
- Q1. 클래스가 왜 필요한가?
- Q2. 객체가 왜 필요한가?
- Q3. 객체를 사용한다는 것은?
Q1. 클래스가 왜 필요한가?
A. 객체를 생성하기 위해
Q2. 객체가 왜 필요한가?
A. 객체를 사용하기 위해
Q3. 객체를 사용한다는 것은?
A. 객체가 가진 속성과 기능을 사용하는 것
객체의 생성과 사용
- 클래스 작성
- 객체 생성
- 객체 사용
1. 클래스 작성(설계도)
class Tv { // Tv클래스 작성(설계도)
String color;
boolean power;
int channel;
void power() { power = !power; }
void channelUp() { channel++; }
void channelDown() { channel--; }
}
2. 객체의 생성(제품)
- 클래스의 객체를 참조하기 위한 참조변수 선언(리모컨)
- new연산자로 객체 '생성'
- 대입연산자(=)로 참조변수와 객체를 ‘연결’
/*
클래스명 변수명; // 클래스의 객체를 참조하기 위한 참조변수 선언
변수명 = new 클래스명(); // 클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장
*/
Tv t; // Tv클래스 타입의 참조변수 t를 선언(Tv 리모콘)
t = new Tv(); // Tv인스턴스를 생성한 후, 생성된 Tv인스턴스의 주소를 t에 저장
/*
Tv t = new Tv(); // 위 두 문장을 한 줄로 표현 가능
*/



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


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




Ex6_2




t2 = t1;
- 참조변수 t1의 값을 t2에 저장



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


- (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() };
*/

클래스의 정의
- 설계도
- 데이터 + 함수
- 사용자정의 타입
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;
}

이제 시, 분, 초가 하나의 단위로 묶여서 다루어지기 때문에 다른 시간 데이터와 섞이는 일은 없겠지만, 시간 데이터에는 다음과 같은 추가적인 제약조건이 있다.이러한 조건들이 모두 프로그램 코드에 반영될 때, 보다 정확한 데이터를 유지할 수 있을 것이다. 객체지향언어가 아닌 언어에서는 이러한 추가적인 조건들을 반영하기가 어렵다. 그러나 객체지향언어에서는 제어자와 메서드를 이용해서 이러한 조건들을 코드에 쉽게 반영할 수 있다.
하나의 소스파일에 여러 클래스 작성
- 하나의 소스파일에는 하나의 클래스만 작성하는 것이 바람직하다.
- 클래스가 두 개 이상인 경우, main메서드가 있는 클래스의 이름과 소스파일의 이름이 일치해야 한다.
- public class가 있는 경우, 소스파일의 이름은 반드시 public class의 이름과 일치해야 한다.
- public class가 하나도 없는 경우, 소스파일의 이름은 'Hello2.java', 'Hello3.java' 둘 다 가능하다.
- 하나의 소스파일에 둘 이상의 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메서드가 있는 클래스 지정하는 방법
|
🍪
📄 - 객체지향개념 암기노트 바로가기
'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 |
