[JAVA] 클래스와 객체

안요한·2022년 5월 19일
0

JAVA

목록 보기
2/16
post-custom-banner

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

클래스의 정의 : 객체를 정의해 놓은 것이다.

클래스의 용도 : 클래스는 객체를 생성하는데 사용된다.

객체의 정의 : 실제로 존재하는 것. 사물 또는 개념

객체의 용도 : 객체가 가지고 있는 기능과 속성에 따라 다름.

유형의 객체 : 책상, 의자, 자동차, TV와 같은 사물

무형의 객체 : 수학공식, 프로그램 에러와 같은 논리나 개념

  • 클래스는 단지 객체를 생성하는데 사용될 뿐, 객체 그 자체는 아니다.

→ 객체를 사용하기 위해서는 먼저 클래스로부터 객체를 생서하는 과정이 '선행'되어야 한다.

2.2 객체와 인스턴스

클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화라고 하며,

어떤 클래스로부터 만들어진 객체를 그 클래스의 인트턴스라고 한다.

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

객체는 속성과 기능, 두 종류의 구성요소로 이루어져 있다.

즉, 객체는 속성과 기능의 집합이라고 할 수 있다.

객체가 가지고 있는 속성과 기능을 그 객체의 '멤버(구성원, member)'라 한다.

클래스로부터 객체를 생성하면, 클래스에 정의된 속성과 기능을 가진 객체가 만들어지는 것이다.

속성 : 멤버변수, 특성, 필드, 상태

속성 → 멤버변수

기능 : 메서드, 함수, 행위

기능 → 메서드

TV를 예로 들어보자.

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에 저장
  • 예제 6-1 TvTest.java
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의 채널을 낮추는 기능을 하는 메서드
}

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 + " 입니다."); 
      } 
}

위 예제는 Tv 클래스로부터 인스턴스를 생성하고 인스턴스의 속성과 메서드를 사용하는 방법.

  1. Tv t;

→ Tv클래스 타입의 참조변수 t를 선언. 메모리에 t를 위한 공간이 마련된다.

아직 인스턴스가 생성되지 않았으므로 참조변수로 아무것도 할 수 없다.

  1. t = new Tv();

→ 연산자 new에 의해 Tv클래스의 인스턴스가 메모리의 빈 공간에 생성.

이 때, 멤버변수는 각 자료형에 해당하는 기본값으로 초기화.

color는 참조형이므로 null로, power는 boolean이므로 false로, channel은 int이므로 0으로 초기화.

대입연산자(=)에 의해 생성된 객체의 주소값이 참조변수 t에 저장.

  1. t.channel = 7;

→ 참조변수 t에 저장된 주소에 있는 인스턴스의 멤버변수 channel에 7을 저장

인스턴스의 멤버변수(속성)을 사용하려면 '참조변수.멤버변수'와 같이 하면 된다.

  1. t.channelDown();

→ 참조변수 t가 참조하고 있는 Tv인스턴스의 channelDown메서드를 호출한다.

멤버변수 channel에 저장되어 있는 값을 1 감소시킨다.

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

  • 예제 6-2/TvTest2.java
class TvTest2 {
	public static void main(String args[]) {
		Tv t1 = new Tv();  
		Tv t2 = new Tv();
		System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
		System.out.println("t2의 channel값은 " + t2.channel + "입니다.");

		t1.channel = 7;	
		System.out.println("t1의 channel값을 7로 변경하였습니다.");

		System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
		System.out.println("t2의 channel값은 " + t2.channel + "입니다.");
	}
}

class Tv { 
    String color;         
    boolean power;        
    int channel;           

    void power()   { power = !power; }   
    void channelUp()   {  ++channel; }  
    void channelDown() {  --channel; }  
}
  1. Tv t1 = new Tv();

    Tv t2 = new Tv();

    인스턴스 t1, t2생성

  2. t1.channel = 7;

    t1이 가리키고 있는 인스턴스의 멤버변수 channel의 값을 7로 변경한다.

"같은 클래스로부터 생성되었을지라도 각 인스턴스의 멤버변수는 서로 다른 값을 유지할 수 있으며,

메서드의 내용은 모든 인스턴스에 대해 동일하다."

  • 예제 6-3/TvTest3.java
class TvTest3 {
	public static void main(String args[]) {
		Tv 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 + "입니다.");
	}
}
  1. t2 = t1

t1은 참조변수이므로, 인스턴스의 주소를 저장하고 있다.

t2가 가지고 있던 값은 잃어버리게 되고 t1에 저장되어 있던 값이 t2에 저장되게 된다.

그렇게 되면 t2역시 t1이 참조하고 있던 인스턴스를 같이 참조하게 되고, t2가 참조하고 있던 인스턴스는 더 이상 사용할 수 없게 된다.(가비지 컬렉터에 의해서 자동적으로 제거)

  1. t1.channel = 7;

  2. t1의 channel 값은 7입니다.

    t2의 channel 값은 7입니다.

이제 t1, t2모두 같은 Tv클래스의 인스턴스를 가리키고 있기 때문에 t1.channel과 t2.channel의 값은 7이다.

"둘 이상의 참조변수가 하나의 인스턴스를 참조하는 것은 가능하지만, 하나의 참조변수로 여러 개의 인스턴스를 가리키는 것은 가능하지 않다."

2.5 객체배열

객체 배열은 참조변수들을 하나로 묶은 '참조 변수 배열'이다.

개체 배열 안에 객체가 저장되는 것은 아니고, 객체의 주소가 저장된다.

Tv tv1, tv2, tv3; →

Tv[] tvArr = new Tv[3];

각 요소는 null로 자동 초기화 된다.

이 객체 배열은 3개의 객체, 정확히는 객체의 주소를 저장할 수 있다.

객체를 생성하고, 각 요소에 저장하는 것을 잊으면 안 된다.!!

배열의 초기화 블럭을 사용하면 , 다음과 같이 한 줄로 간단히 할 수 있다.

Tv[] tvArr = { new Tv(), new Tv(), new Tv()};

다뤄야할 객체의 수가 많을 때는 for문을 사용하면 된다.

Tv[] tvArr = new Tv[100];

for(int i=0; i<tvArr.length; i++){

tvArr[i] = new Tv();

}

"객체 배열도 같은 타입의 객체만 저장 가능.

하지만 다형성을 배우고 나면 여러 종류의 객체를 하나의 배열에 저장 가능!"

2.6 클래스의 또 다른 정의

프로그래밍적인 관점에서 클래스의 정의와 의미를 살펴보도록 하자.

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

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

기본형의 개수는 8개이지만, 참조형의 개수가 정해져 있지 않은 이유는 프로그래머가 새로운 타입을 추가할 수 있기 때문.

int hour;

int minute;

int second;

만약 3개의 시간을 다뤄야 한다면

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;

}

위의 코드는 시,분,초를 저장하기 위한 세 변수를 멤버변수로 갖는 Time클래스 정의

profile
걍이렇게돼브렀다리
post-custom-banner

0개의 댓글