Dev-Kyuu
article thumbnail

 

Chapter 6-2 . 필드 && Chapter 6-3. 생성자


📌 1.  필드

  • 필드는 객체 고유의 데이터, 객체가 가져가야 할 부품 & 현재 상태 데이터를 저장하는 곳이다.
  • 클래스에 포함된 변수를 의미하며, 객체의 속성을 정의할 떄 사용한다.
  • 필드는 초기값을 주더라도 자동으로 초기화되며, 객체 외부에서 접근 시 객체를 생성하고 참조 변수를 통해 사용해야한다.

 

🔔 ) 자바에서 변수는 클래스 변수, 인스턴스 변수, 지역 변수가 있는데 이 중 필드라 부르는건 클래스 변수와 인스턴스 변수이다.

  • 클래스 변수와 인스턴스 변수 :
    - 이 둘은 static 키워드의 유무로 구분하는데 Static 키워드가 함께 선언되면 클래스 변수 / 그렇지 않은 것은 인스턴스 변수이다.
class Card {
     String kind ;                           // 카드의 무늬 - 인스턴스 변수
     int number;                            // 카드의 숫자 - 인스턴스 변수
     static int width = 100 ;             // 카드의 폭 - 클래스 변수
     static int height = 250 ;            // 카드의 높이 - 클래스 변수
}

위 카드 클래스를 예로 클래스 변수와 인스턴스 변수의 차이를 알아보자면

우선 카드는 자신만의 무늬 (하트, 다이아몬드 등)와 숫자를 카드별로 다르게 가지고 있지만,

각 카드들의 크기(폭, 높이)는 모든 인스턴스가 공통적으로 같은 값을 유지해야한다.

 

인스턴스 변수는 인스턴스가 생성될 때 마다 생성되므로, 인스턴스가 각기 다른 값을 유지할 수 있지만 

클래스 변수는 모든 인스턴스가 하나의 저장 공간을 공유 하므로 항상 공통적인 값을 같게되어 위와 같이 구별하여 사용하는것이다.

 

 

여기서 Static 키워드란?

  • java에서는 필요할때 클래스를 만들고, 사용할때는 생성자를 통해서 객체를 만들어서 사용하는데, 이러한 방식에서 문제가 생길때가 있다.

  • 위 그림으로 예를 들어 보자면? 3명의 구매자는 2개의 사과가 있는것을 알고 있다.
  • 구매자 A는 사과 객체를 생성해서 사과를 구매하고, B도 사과 객체를 생성하여 사과를 구매하고, C도 사과 객체를 생성하여 사과를 구매한다.
  • 그럼 실제로는 사과는 2개 밖에 없지만 3명의 구매자가 사과를 구매하게 되는 버그 상황이 발생하는것이다.
  • 이때 static 키워드를 사용하여 사과 판매대의 정보를 공유하면 이 버그를 해결할 수 있게 된다.

 

Static 키워드를 사용하는 법 

 

1. 마켓 클래스 

public class market {
	public static int apple = 2;
    
    public appleSales() {
    }
 }
 
2. 구매자 A의 클래스
 
 public class firstCustomer {
 	public class firstCustomer() {
    }
    
    public void getApple(int apple){
    
    	appleSales.apple = appleSales.apple - apple;			// static으로 선언할 경우 객체를 생성하지않고 클래스 이름을 통해 접근이 가능해짐
        
       	if(market.apple < 0){
        	System.out.println("사과 재고 업승")
            }
         }
   	}      
   
    
 **/ 만약에 사과가 static으로 선언된게 아니였다면 19라인은 아래와 같이 작성해야 사용 할 수 있음 
market marketApple = new market();
market.apple;

3. main 클래스 

public class Main {
	public static void main(String[] args){
    	firstCustomer firstCustomer = new firstCustomer();
        firstCustomer.getApple(1);
        
        SecondCustomer secondCustomer = new SecondCustomer();
        secondCustomer.getApple(1);
        
        .. 세번쨰 사용자 동일
        
        }
     }

Static 키워드는 위와 같이 사용할 수 있고, 아래와 같은 경우에 사용한다.

 

Static 키워드 사용 용도

  1. 클래스를 설계할 때, 멤버 변수 중 모든 인스턴스에 공통적으로 사용해야 하는것에만 static을 사용한다.
    - 인스턴스를 생성하면, 각 인스턴스들은 서로 독립적기 때문에 서로 다른 값을 유지한다경우에 따라서는 각 인스턴스들이
       공통적으로 같은 값이 유지되어야 하는 경우
     static을 붙인다.
  2. Static이 붙은 멤버 변수는 인스턴스를 생성하지 않아도 사용할 수 있다.
     - static이 붙은 멤버변수(클래스변수)는 클래스가 메모리에 올라갈때 이미 자동적으로 생성되기 때문인데 이와 같은 이유때문에 
       공통적으로 값을 유지해야하는 인스턴스가 아닐경우 메모리 과 사용을 할 수 있기 때문에 사용시 고려해야한다.

    *). Static 사용 지침

         - 클래스의 멤버변수 중 모든 인스턴스에 공통적인 값을 유지해야하는것이 있는지 살펴보고, 있으면 Static을 붙여준다.

         - 작성한 메서드 중 인스턴스 변수를 사용하지 않는 메서드에 대해서도 Static을 붙일것을 고려한다.

 

내용 참조 : https://vaert.tistory.com/101

 

📌 2.  생성자

  • 생성자는 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메소드'이다.
  • 주로 일반 멤버 변수의 초기화나, 객체를 생성할 때 실행하는 작업을 정리하며 리턴값이 없다.
  • 생성자는 클래스내에 선언되고, 타입이 다를 경우 오버로딩이 가능하므로 하나의 클래스에 여러개의 생성자가 존재할 수 있다.

 

🔎 그럼 생성자는 왜 쓸까?

- 찾아보니 자바의 창시자가 FM 그 잡채여서 그렇게 설계 한 것 같다 생성자로 변수를 초기화하고, 메서드는 기능만 담당하도록 ?..

 

 

2.1 기본 생성자(+New 키워드)

  • 우리는 생성자를 사용하지 않았음에도, java 사용에 문제가 없었는데 그 이유는 new 키워드가 그 역할을 해주었기 때문이다.
  • 별도의 생성자를 만들지 않았을 때 컴파일러에 의해 자동으로 생성자가 만들어지는데 이를 기본 생성자 라고 한다.
    ( 생성자를 만들지않았지만 new라는 키워드를 통해서 BasicConstructor person = new BasicConstructor()를 통해서 자동으로 public BasicConstructor() {} 기본연산자가 생성된다고 함)
public class market {

	String name;
    int value;
    // public market() {} // 생략된 기본 생성자
    
	public static void main(String[] args){
    	 market product = new  market();		//new연산자가 Market을 호출하면 컴파일러가 자동으로 기본 생성자를 만든다.
       
        product.name = "Apple";					// 기본 생성자 이므로 외부에서 객체의 멤버 변수를 설정해야한다.
        Product.value = 3;
        
        
        }
     }

위에서 생성한 생성자는 기본 생성자로, 외부에서 객체의 멤버 변수를 설정해주어야하는데 매개 변수가 있는 생성자를 사용한다면,

원하는 인스턴스를 생성함과 동시에 원하는 값으로 초기화를 할 수 도 있음!

 

2.2  생성자 VS Void 메서드 

  • 생성자는 형태가 없는 void 메서드와 비슷하게 생겼는데 이들은 어떠한 차이가 있을까?
  • 차이점 : 이름과 역할
    (1) 이름 : 생성자는 class 명과 똑같아야하고, 메서드는 달라야함
    (2) 역할 : 메서드는 다양한 기능들을 담당하는 역할이지만, 생성자는 멤버변수의 초기화만을 담당한다.

 

2.3 This 키워드 -this()와 this

  • this에는 두가지 용법이 있는데, 아래와 같다.
    - this는 현재 객체를 참조하기 위한 용도 / this()는 다른 생성자를 호출하는 용도이다.
// 1. This 미사용
public class ThisPerson {
	
	String name;
	int age;
	boolean isHugry;
	
	ThisPerson(String name, int age, boolean isHungry){
		name = name; //컴파일러가 첫번째 name은 멤버변수로 두번째 Name은 매개변수로 구별을 하지 못한다.
		age = age;
		isHungry = isHungry;
	}
}

// 2. This 사용

public class ThisPerson {
	
	String name;
	int age;
	boolean isHugry;
	
	ThisPerson(String name, int age, boolean isHungry){
		this.name = name; 		// 매개변수로 받은 this.name을 출력하는 코드이다.
		this.age = age;
		this.isHungry = isHungry;
	}

    public static void main(String[] args) {
            ThisPerson person = new ThisPerson("홍지민", 20, true);
            System.out.println(person.print());
        }
}

- this는 객체에 대한 참조값이기 때문에 객체가 생성되기 전에는 사용할 수 없다.

 

 

다른 생성자를 호출할때 사용하는 This()

  • 자바는 다양한 방법으로 객체를 생성할 수 있도록 생성자 오버로딩을 제공한다.
  • 생성자 오버로딩이란, 파라미터를 다르게 해서 여러개의 생성자를 정의하는것을 말한다.
  • 생성자 오버로딩이 많아 질 경우 생성자 간의 중복 코드가 발생할 수 있는데 (=매개변수 수만 달리하고 필드 초기화 내용이 비슷할 때 )
  • 필드 초기화 내용은 한 생성자에만 집중적으로 사용하고, 나머지는 초기화 내용을 가진 생성자를 호출한다.!
public class OverloadConstructorPerson {

	String name = "한사장";
	int age = 90;
	boolean isHugry = false;
	
	OverloadConstructorPerson(String name, int age, boolean isHungry){
		//아래 3줄의 중복코드가 발생함.
		this.name = name;
		this.age = age;
		this.isHugry = false;
	}
	
	OverloadConstructorPerson(String name, int age){
		//this()용법사용
		this(name, age, false);
	}
}
profile

Dev-Kyuu

@kyuu_ng

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!