[자바의 정석] chaper06 객체지향 프로그래밍1/ 2. 클래스와 객체

임대진·2022년 2월 27일
0

2. 클래스와 객체

2.1 클래스와 객체의 정의와 용도

  • 클래스의 정의 클래스란 객체를 정의해 놓은 것이다.
  • 클래스의 용도 클래스는 객체를 생성하는데 사용된다.
  • 객체의 정의 실제로 존재하는 것, 사물 또는 개념
  • 객체의 용도 객체가 가지고 있는 기능과 속성에 따라 다름
  • 유형의 객체 책상, 의자, 자동차, TV와 같은 사물
  • 무형의 객체 수학공식, 프로그램 에러와 같은 논리나 개념
  • 프로그래밍에서의 객체는 클래스에 정의된 내용대로 메모리에 생성된 것을 뜻한다.

※ 객체를 사용한다는 것은 객체가 가지고 있는 속성과 기능을 사용한다는 뜻

클래스객체
제품 설계도제품
붕어빵 기계붕어빵
TV 설계도TV

2.2 객체와 인스턴스

  • 클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화(instantiate)
  • 클래스로부터 만들어진 객체를 그 클래스의 인스턴스(instance)
  • 클래스 ————→인스턴스(객체)
    인스턴스화

2.3 객체의 구성요소-속성과 기능

  • 객체는 속성과 기능의 집합
  • 객체의 멤버(구성원,member): 객체가 가지고 있는 속성과 기능
  • 클래스란 객체를 정의한 것이므로 클래스에는 객체의 모든 속성과 기능이 정의되어 있다.
  • 클래스로부터 객체를 생성하면, 클래스에 정의된 속성과 기능을 가진 객체가 만들어지는 것이다.

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

  • ‘속성’ 보다는 ‘멤버면수’ ‘기능’보다는 ‘메서드’ 주로 사용
class Tv{
  String color ; // 색깔
  boolean power; // 전원상태
  int channel; // 채널

  void power() { power = !power;}
  void channelUp() { channel++;}
  void channelDown() { channel--;}
}

※ 멤버변수와 메서드를 선언하는데 있어서 순서는 관계없지만, 일반적으로 메서드보다는 멤버변수를 먼저 선언하고 멤버변수는 멤버변수끼리 메서드는 메서드끼리 모아 놓는 것이 일반적이다.

2.4 인스턴스의 생성과 사용

  • 클래스로부터 인스턴스를 생성하는 방법
클래스명 변수명; //클래스의 객체를 참조하기 위한 참조변수를 선언
변수면 = new 클래스명(); //클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장 

Tv t;        // Tv클래스 타입의 참조변수 t를 선언
t = new TV(); // Tv인스턴스를 생성한 후, 생성된 Tv인스턴스의 주소를 t에 저장
package ch6;

class Tv{
	// Tv의 속성(멤버변수)
	String color;  //색상
	boolean power; //전원상태(on/off)
	int channel;   //채널
	
	// Tv의 기능(메서드)
	void power() {power = !power;}  // TV를 켜거나 끄는 기능을 하는 메서드
	void channelUp() { ++channel;} // TV의 채널을 높이는 기능을 하는 메서드
	void channelDown() {--channel;} // TV의 채널을 낮추는 기능을 하는 메서드
}

public class TvTest {

	public static void main(String[] args) {
       Tv t;  // Tv인스턴스를 참조하기 위한 변수 t를 선언
       t = new Tv();  // Tv인스턴스를 생성한다.
       t.channel = 7; // Tv인스턴스의 멤버변수 channel의 값을 7로 한다. 
       t.channelDown(); // Tv인스턴스의 메서드 channelDown()을 호출한다. 
       System.out.println("현재 채널은 " + t.channel + "입니다.");
	}

}

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

package ch6;

class Tv{
	// Tv의 속성(멤버변수)
	String color;  //색상
	boolean power; //전원상태(on/off)
	int channel;   //채널
	
	// Tv의 기능(메서드)
	void power() {power = !power;}  // TV를 켜거나 끄는 기능을 하는 메서드
	void channelUp() { ++channel;} // TV의 채널을 높이는 기능을 하는 메서드
	void channelDown() {--channel;} // TV의 채널을 낮추는 기능을 하는 메서드
}

public class TvTest2 {

	public static void main(String[] args) {
		Tv t1 = new Tv(); // Tv t1; t1 = new Tv();를 한 문장으로 가능
		Tv t2 = new Tv();
		System.out.println("t1의 channel값은" + t1.channel + "입니다.");
		System.out.println("t2의 channel값은" + t2.channel + "입니다.");
		
		t1.channel = 7; // channel 값을 7으로 한다.
		System.out.println("t1의 channel값을 7로 변경하였습니다.");
		
		System.out.println("t1의 channel값은" + t1.channel + "입니다.");
		System.out.println("t2의 channel값은" + t2.channel + "입니다.");
		

	}

}

같은 클래스로부터 생성되었을지라도 각 인스턴스의 속성(멤버변수)은 서로 다른 값을 유지할 수 있으며, 메서드의 내용은 모든 인스턴스에 대해 동일하다.

package ch6;

class Tv{
	// Tv의 속성(멤버변수)
	String color;  //색상
	boolean power; //전원상태(on/off)
	int channel;   //채널
	
	// Tv의 기능(메서드)
	void power() {power = !power;}  // TV를 켜거나 끄는 기능을 하는 메서드
	void channelUp() { ++channel;} // TV의 채널을 높이는 기능을 하는 메서드
	void channelDown() {--channel;} // TV의 채널을 낮추는 기능을 하는 메서드
}

public class TvTest3 {

	public static void main(String[] args) {
		Tv t1 = new Tv(); // Tv t1; t1 = new Tv();를 한 문장으로 가능
		Tv t2 = new Tv();
		System.out.println("t1의 channel값은" + t1.channel + "입니다.");
		System.out.println("t2의 channel값은" + t2.channel + "입니다.");
		
		t2 = t1; // t1이 저장하고 있는 값(주소)을 t2에 저장한다.
		t1.channel = 7; // channel 값을 7으로 한다.
		System.out.println("t1의 channel값을 7로 변경하였습니다.");
		
		System.out.println("t1의 channel값은" + t1.channel + "입니다.");
		System.out.println("t2의 channel값은" + t2.channel + "입니다.");
		

	}

}

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

2.5 객체 배열

  • ‘객체 배열’ - 객체 역시 배열로 다루는 것이 가능
package ch6;

public class TvTest4 {

	public static void main(String[] args) {
		Tv[] tvArr = new Tv[3]; // 길이가 3인 Tv객체 배열
		
		// Tv객체를 생성해서 Tv객체 배열의 각 요소에 저장 
		for(int i=0; i<tvArr.length;i++) {
			tvArr[i] = new Tv();
			tvArr[i].channel = i+10; // tvArr[i]의 channel에 i+10을 저장
		}
		
		for(int i=0; i<tvArr.length;i++) {
			tvArr[i].channelUp(); // tvArr[i]의 메서드를 호출. 채널이 1증가
			System.out.printf("tvArr[%d].channel=%d%n",i, tvArr[i].channel);
		}

	}//main의 끝

}

class Tv{
	// Tv의 속성(멤버변수)
	String color;  //색상
	boolean power; //전원상태(on/off)
	int channel;   //채널
	
	// Tv의 기능(메서드)
	void power() {power = !power;}  // TV를 켜거나 끄는 기능을 하는 메서드
	void channelUp() { ++channel;} // TV의 채널을 높이는 기능을 하는 메서드
	void channelDown() {--channel;} // TV의 채널을 낮추는 기능을 하는 메서드
}

2.6 클래스의 또 다른 정의

  • 클래스 - 객체를 생성하기 위한 틀
  • 클래스 - ‘속성과 기능 정의’
  1. 클래스 - 데이터와 함수의 결합
  1. 변수 하나의 데이터를 저장할 수 있는 공간
  2. 배열 같은 종류의 여러 데이터를 하나의 집합으로 저장할 수 있는 공간
  3. 구조체 서로 관련된 여러 데이터를 종류에 관계없이 하나의 집합으로 저장할 수 있는 공간
  4. 클래스 데이터와 함수의 결합(구조체 + 함수)
  • 함수는 주로 데이터를 가지고 작업을 하기 때문에 많은 경우에 있어서 데이터와 함수는 관계가 깊다. 그래서 자바와 같은 객체지향언어에서는 변수(데이터)와 함수를 하나의 클래스에 정의하여 서로 관계가 깊은 변수와 함수들을 함께 다룰 수 있게 했다.
  1. 클래스 - 사용자정의 타입(user-defined type)
  • 프로그래밍언어에서 제공하는 자료형(primitive type)외에 프로그래머가 서로 관련된 변수들을 묶어서 하나의 타입으로 새로 추가하는 것을 사용자정의 타입(user-defined type)이라고 한다.
  • 자바와 같은 객체지향언어에서는 클래스가 곧 사용자 정의 타입이다.

| int hour1, hour2, hour3;
int minute1, minute2, minute3;
int second1, second2, second3; |
| --- |
| int[] hour = new int[3];
int[] minute = new int[3];
float[]second = new float[3]; |
| class Time{
int hour;
int minute;
float second;
} |

시, 분, 초를 하나로 묶는 사용자정의 타입, 즉 클래스를 정의하여 사용해야 한다.

profile
신입개발자 공부기록 블로그

0개의 댓글