Skip to main content

객체 지향 프로그래밍 클래스의 멤버

클래스 멤버

  • 클래스의 멤버(속성 및 메서드)에 대한 접근 제어 수준을 나타내는 키워드

public

  • 공개
  • 외부에서 자유롭게 접근 가능한 상태를 표현
class Info {
public name: string;
public age: number;

constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
}

let a = new Info("JJamVa", 27);
a.name = "Hong";

console.log(a); // {name:"Hong", age:27}
tip

public이 붙은 속성은 object의 속성 값 수정이 직접적으로 가능하다.
public을 작성하나 안하나에 대해 동작이 다른점은 없다.
또한, public을 이용하여 생성자를 간단하게 작성할 수 있다.

class Info {
constructor(public name: string, public age: number) {}
}

let a = new Info("JJamVa", 27);
console.log(a); // {name:"JJamVa", age:27}

constructor parameter에 public 키워드 혹은 이외 private, protected 등 사용하면 입력된 값을 저장한다.

private

  • 비공개
  • 해당 클래스 내에서만 접근 가능한 상태
  • 클래스 외부에서는 접근 불가능
class Info {
public name: string;
private age: number;

constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
}

let a = new Info("JJamVa", 27);
a.name = "Hong";
// a.age = 37;// 에러 발생

console.log(a); // {name:"Hong", age:27}
note

private를 사용할 경우, class내부에 있는 private속성에 직접적으로 접근이 불가능하다.
만약 데이터를 바꾸거나 데이터를 호출해야할 경우, class내부에서 getter, setter라는 사용자 정의 메소드를 만들어야한다.

class Info {
public name: string;
private age: number;

constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
getAge(): number {
return this.age;
}
setAge(age: number) {
this.age = age;
}
}

let a = new Info("JJamVa", 27);
a.name = "Hong";
console.log(a.getAge()); // 27

a.setAge(37);
console.log(a); // {name:"Hong", age:37}

getAge, setAge를 private age변수에 접근하지않고 접근 및 확인이 가능하다.
변경되면 안되거나 중요한 변수같은 경우 private를 사용하면 된다.

protected

  • 보호
  • 자식 클래스에서만 접근 가능한 상태
  • 외부에서는 접근할 수 없으며, 상속 관계에 있는 자식 클래스에서만 사용 가능
class Dimension2 {
protected x: number;
protected y: number;

constructor(x: number, y: number) {
this.x = x;
this.y = y;
}
}

class Display extends Dimension2 {
increaseX() {
this.x += 10;
}
display() {
console.log(`x좌표는 ${this.x} y좌표는 ${this.y}`);
}
}

let dot = new Display(10, 20);
console.log(dot); // {x: 10, y: 20}
// dot.x = 200;// 에러 발생
dot.increaseX();
dot.display(); // x좌표는 20 y좌표는 20
note

protected를 이용해 생성된 Dimension2의 필드값들은 Display에게 상속되어 값 공유가 가능한 것을 확인
Dimension2의 x 필드값에 직접적인 접근으로 값변경을 하였을 때, 에러가 발생하는 것도 발견하였다.
자식 class인 Display에서 increaseX메소드를 통해 x값 변화가 있는 것을 확인함으로서
protected는 상속된 class관계에선 값을 변경할 수 있다는 점을 확인하였다.

static

  • 클래스의 인스턴스가 아닌 클래스 자체에 속하는 정적 메소드 혹은 속성
  • 클래스의 인스턴스를 생성하지 않고 직접 호출이 가능
class Dot {
static x: number = 10;
y: number = 20;
}

let a = new Info();
console.log(a.x); // 에러 발생
console.log(Dot.x); // 10
Dot.x = 50;
console.log(a); // {y: 20}
console.log(Dot.x); // 50
note

static 키워드를 사용하는 순간 class의 인스턴스속성 접근이 불가능하다.
class자체의 속성을 이용하여 직접 값을 변경 및 값을 출력할 수 있다.

class의 변수뿐만이 아닌 함수(메소드)도 static을 사용이 가능
extends를 통해 상속관계인 class에게도 static이 붙은 변수 및 메소드도 같이 이동한다.
static은 앞서 나온 public, private,protected와 함께 사용이 가능하다.

class Info {
private static userName: string = "JJamVa";
}
// Info class 단독 속성으로 호출하여 사용 가능