공부/인프런 - Rookiss

Part 1-4-2. 객체지향 : 생성자, static

셩잇님 2023. 8. 2. 14:51
반응형

 

 

생성자

 

객체를 new로 생성함과 동시에 멤버 값들을 원하는대로 초기화하고 싶을 때 생성자를 사용한다.

  • 클래스 이름과 같아야 함
  • 접근 지정자 ⭕, 리턴타입, 매개변수 ❌ 

 

public Knight()
{
    hp = 100;
    attack = 10;
}

public Knight(int hp) : this()
{
    this.hp = hp;
}

 

 

생성자 이름 옆에 : this() 👉 ‘디폴트 생성자 호출해줘’ 라는 의미

  • 따라서 this.hp = hp를 실행하기 전에 Knight()를 호출하여 hp = 100와 attack = 10 를 먼저 실행하게 된다.
  • 따라서 자연스럽게 Knight(int hp) 생성자에서 hp 값만 설정헀어도 attack은 10 으로 설정이 미리 된다.

 


 

static

 

[static이 아닌 일반 멤버들]

 

종속된 객체 인스턴스들 마다 메모리가 별개다.

  • 같은 클래스 타입이라도 객체들은 서로 속성값도 다를 수 있으며 별개의 존재이다.
  • static이 아닌 일반 멤버 변수, 함수들은 객체에 종속된다.

 

[static 멤버 변수, 멤버 함수]

 

static인 멤버 메모리를 같은 타입의 모든 객체들이 공유 한다. 

  • 따라서 오직 해당 멤버가 전체 메모리 상에서 단 1 개만 존재한다.

 

객체에 종속되지 않는다.

  • 따라서 객체 생성 후 객체 이름으로 호출하는 것이 아닌 클래스 이름으로 호출한다.
  • 객체 생성할 필요가 없다.

 

static 함수 내에선 특정 일반 객체 멤버를 사용할 수 없다.

 

  • 공용 함수니까 애당초 어떤 객체의 멤버를 사용해야 하는지 알 수 없기 때문이다.
  • 그렇다고 아예 못 쓴다는 것은 아니고 함수 바깥의 어떤 특정 일반 객체 멤버를 사용할 수 없다는 것 뿐이다! 예를 들면 this같이… 예를 들어 static함수 내부에서 아예 새롭게 객체를 만들고 이를 리턴하는 작업은 가능하다.

 

static public void Test()
{
    this.id = 23; // ❌ 에러! 특정 객체 멤버는 사용할 수 없음
    hp = 100;     // ❌ 에러! 특정 객체 멤버는 사용할 수 없음
}

static public Knight CreateKnight()  // 문제 없음. 가능. ⭕
{
    Knight knight = new Knight();
    knight.hp = 100;
    knight.attack = 1;
    return knight;
}

 

위와 같이 static 함수 내에선 일반 멤버는 사용할 수 없고 static 멤버 변수만 사용할 수 있다.

 

 

 

반응형