* JAVA - 객체지향 프로그래밍(1)

jodbsgh·2022년 3월 14일
0

💡"JAVA"

목록 보기
10/67

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

클래스의 정의

  • 클래스란 객체를 정의해 놓은 것

클래스의 용도

  • 클래스는 객체를 생성하는데 사용

객체의 정의

  • 실제로 존재하는 것. 사물 또는 개념

겍체의 용도

  • 객체가 가지고 있는 기능과 속성에 따라 다름

객체와 인스턴스

클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화(instantiate)라고 하며, 어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스(instance)라고 한다.

인스턴스와 객체는 같은 의미이므로 두 용어의 사용을 엄격히 구별할 필요는 없다. 하지만 문맥에 따라 구별하여 사용하는 것이 좋다.

	클래스 ---인스턴스화---> 인스턴스( 객체 )

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

객체는 속성과 기능의 집합이라고 할 수 있다.
클래스란 객체를 정의한 것이므로 클래스에는 객체의 모든 속성과 기능이 정의되어있다.
속성(property) = 멤버변수
기능(function) = 메서드, 함수

인스턴스의 생성과 사용

클래스를 선언하는 것은 설계도를 작성한 것에 불과하다.
즉, 인스턴스를 생성해야 사용할 수 있다.

클래스명 변수명;	
//클래스의 객체를 참조하기 위한 참조변수를 선언

변수명 = new 클래스명() 
//클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장

TV t;
//TV클래스 타입의 참조변수 t를 선언

t = new TV();
//TV인스턴스를 생성한 후, 생성된 TV인스턴스의 주소를 t에 저장

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

t = new TV();
연산자 new에 의해 TV클래스의 인스턴스가 메모리의 빈 공간에 생성된다.
이 때, 멤버변수는 각 자료형에 해당하는 기본값으로 초기화 된다.

인스턴스에서 구현된 메서드를 참조변수 t를 통해서 사용할 수 있게 되었다.

t.메서드명();	//참조변수 t를 통해서 인스턴스의 메서드 호출

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

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

class TvTest2()
{
	public static void main(String args[])
    {
    	Tv t1 = new Tv();
        Tv t2 = new Tv();
        
        System.out.printlnl(t1.channel);
        System.out.printlnl(t2.channel);
        
        t1.channel = 7; //chnnel 값을 7로 한다.
        System.out.printlnl(t1.channel);
        System.out.printlnl(t2.channel);
    }
}

실행결과
0
0
7
0

예제에서 Tv클래스의 인스턴스 t1과 t2를 생성한 후에, 인스턴스 t1의 멤버변수인 channel의 값을 변경했다.
같은 클래스로부터 생성되었을지라도 각 인스컨스의 속성은 서로 다른 값을 유지할 수 있으며, 메서드의 내용은 모든 인스턴스에 대해 동일하다.

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

class TvTest2()
{
	public static void main(String args[])
    {
    	Tv t1 = new Tv();
        Tv t2 = new Tv();
        
        System.out.printlnl(t1.channel);
        System.out.printlnl(t2.channel);
        
        t2 = t1;	//t1이 저장하고 있는 값을 t2에 저장
        
        t1.channel = 7; //chnnel 값을 7로 한다.
        System.out.printlnl(t1.channel);
        System.out.printlnl(t2.channel);
    }
}

실행결과
0
0
7
7

t2 = t1;
t1은 참조변수이므로, 인스턴스의 주소를 저장하고 있다. 이 문장이 수행되면, t2가 가지고 있던 값은 잃어버리게 되고 t1에 저장되어 있던 값이 t2에 저장되게 된다. 그렇게 되면 t2역시 t1이 참조하고 있던 인스턴스를 같이 참조하게 되고, t2가 원래 참조하고 있던 인스턴스는 더 이상 사용할 수 없게 된다.

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

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

profile
어제 보다는 내일을, 내일 보다는 오늘을 🚀

0개의 댓글