객체와 클래스, 인스턴스

Eunjeon_g·2023년 2월 23일
0
post-thumbnail

객체와 클래스, 인스턴스의 관계는 붕어빵과도 같다.

붕어빵을 만들기 위해서는 붕어빵 틀이 필요하다.
이 틀 하나면 다수의 붕어빵을(팥, 슈, 초코...) 만들 수 있다.

이때 붕어빵을 객체, 붕어빵 틀을 클래스, 붕어빵 종류를 인스턴스에 비유할 수 있다.

객체를 만들기 위해서는 클래스가 필요하고, 클래스를 통해 인스턴스를 여러개 만들 수 있다.


1. 객체 생성

클래스 변수 = new 클래스();

객체를 생성하기 위해서는 new연산자가 필요하다.
이 때 new 연산자는 객체의 주소값을 리턴한다.

//Student라는 클래스가 있다고 가정하자
Student student = new Student();
힙 영역에 Student 객체가 만들어지고, 스택 영역에 만들어진 student 변수에는 Student 인스턴스의 주소값이 들어간다.

2. 클래스의 구성

  • 필드
    : 객체의 데이터 저장하는 역할로 자동으로 초기화된다.
  • 생성자
    : 객체 생성 시 초기화 역할을 하며, 클래스와 동일한 이름을 가져야한다.
  • 메소드
    : 객체가 수행할 동작으로 함수라고 생각하면 된다.
public class FishBread{
	//필드
	String taste;
    int price;
    
    //생성자
    FishBread(){ }
    
    //메소드
    void makeFishBread(){ }
}

3. 필드
: 인스턴스 필드와 공유 필드가 있다.
인스턴스 필드는 해당 객체만 접근할 수 있고, 공유 필드는 클래스로 접근할 수 있다. 이는 모든 인스턴스가 같은 값을 사용하게 된다. 붕어빵의 총 개수를 알고싶을 때...사용하며, static을 붙여준다.

public class FishBread{
	String taste;
    int price;
    static int total;
    
    //default 생성자
    FishBread(){
    	//인스턴스가 생성될 때마다 증가하며, 모든 인스턴스가 같은 total을 공유한다.
    	total++;
    }
}
...
//클래스로 호출할 수 있다.
	FishBread fishBread = new FishBread();
	FishBread.total;
필드는 외부로부터 값의 손상을 막기 위해 private를 사용해주는 것이 좋다.

4. 생성자
new 연산자는 객체를 생성한 후 생성자를 호출해 객체를 초기화한다.

  • 기본 생성자
    : 클래스에 생성자 선언이 없으면 컴파일러는 기본 생성자를 자동으로 생성한다.

  • 생성자 오버로딩
    : 매개변수를 다르게하여 생성자를 선언하는 것이다.

//다음과 같이 생성자를 호출할 때 매개값을 전달할 경우
FishBread fishBread = new fishBread("슈크림", 500);
...
public class FishBread{
	String taste;
    int price;
    static total;
    
    //생성자를 통해 초기화를 진행할 수 있다.
    FishBread(String taste, int price){
    	//this는 호출한 객체를 말한다.
        //호출한 객체의 taste에 "슈크림"을 넣는 것이다.
    	this.taste = taste;
        this.price = price;
        total++;
    }
   }

생성자 오버로딩은 여러개 가능하다. 이때 같은 형태의 매개변수는 사용할 수 없다.

public class FishBread{
	String taste;
    int price;
    static total;
    
    FishBread(){
    	taste = "팥;
        price = 600;
        total++;
    }
    
    FishBread(String taste){
    	this.taste = taste;
        total++;
    }
    
    FishBread(String taste, int price){
    	this.taste = taste;
        this.price = price;
        total++;
    }
  }

위와 같이 생성자가 여러개일 경우 중복되는 값이 있을것이다. 추후 유지보수를 위해 다음과 같이 this()를 사용해 자신의 생성자를 호출하면 중복을 방지할 수 있다.

public class FishBread{
	String taste;
    int price;
    static int total;
    
   FishBread(){
   		//최상단에 작성해야 한다.
		this("팥",600);
    }
    
    FishBread(String taste){
    	this(taste, null);
    }
    
    FishBread(String taste, int price){
    	this.taste = taste;
        this.price = price;
        total++;
    }
  }

5. 메소드 선언과 호출

  • 메소드 선언
    리턴타입 메소드명 ( 매개변수 ){ };
public class FishBread{
	String taste;
    int price;
    
    void complite(){
    	System.Out.println(taste + "맛 붕어빵 완성");
    }
  }
  • 메소드 호출
    인스턴스 객체가 존재해야 메소드를 호출할 수 있다.
	FishBread fishBread = new FishBread("슈크림", 300);
	fishBread.complite();    

이때 public이 붙으면 다른 패키지에서도 호출이 가능하다. 위와같이 생략되어 있다면, 같은 패키지 내에서만 호출이 가능하다.

0개의 댓글