추상클래스를 상속받은 구현클래스에서 private 접근 불가관련 해서 질문 있습니다.
462
작성한 질문수 7
추상 클래스에서 private으로 선언한 것은 추상클래스를 상속받아 구현하는 실제 클래스에서도 접근이 안되고 protected로 바꾸라고 하던데
어짜피 구현은 추상클래스를 상속받은 구현클래스에서 해야하는데 접근 할 수 없다면 추상클래스에서 private가 어떤 역할을 하는건지 모르겠습니다.
// 추상 클래스
abstract class AbstractClass {
private readonly a: string = "init";
protected b: number = 1;
c: string = "기본값이 public";
abstract method(a: string): void;
method2() {
console.log(this.a);
console.log(this.b);
console.log(this.c);
}
}
class realClass extends AbstractClass {
method(a: string) {
console.log(this.a); //error
console.log(this.b);
console.log(this.c);
}
}
type error msg : TS2341: Property 'a' is private and only accessible within class 'AbstractClass'.
답변 3
0
추상 클래스에서 private 필드를 쓸 일이 있냐고, 대체 어떨 때 쓰길래 필요한건지 물어보신 것 같습니다.
abstract method가 존재할 수 있다는 것만 빼면 abstract class도 class와 동일한 역할을 합니다. 즉, 추상메서드가 아닌 일반 메서드가 존재할 수 있고, 그 메서드에서만 사용하는 변수가 필요하다면 프라이빗으로 쓸 수도 있습니다. 진짜로 쓸모있는 abstract class에서의 private 변수 예시입니다.
abstract class Animal {
private callCount: number = 0;
abstract crying(): void;
call():void{
this.crying();
this.callCount++;
console.log(`저를 ${this.callCount}번째 불러주셨군요?`);
}
}
class Dog extends Animal{
crying(){
console.log("멍멍");
}
}
class Cat extends Animal{
crying(){
console.log("야옹");
}
}
const main = ():void => {
const choco: Dog = new Dog();
const bori: Dog = new Dog();
const nabi: Cat = new Cat();
choco.call(); //멍멍 저를 1번째 불러주셨군요
bori.call(); //멍멍 저를 1번째 불러주셨군요
choco.call(); //멍멍 저를 2번째 불러주셨군요
choco.call(); //멍멍 저를 3번째 불러주셨군요
nabi.call(); //야옹 저를 1번째 불러주셨군요
nabi.call(); //야옹 저를 2번째 불러주셨군요
bori.call(); //멍멍 저를 2번째 불러주셨군요
}
main();위 예제에서 call()은 모든 Animal이 가지는 메서드이고 각 동물이 몇번 불렸는지를 출력해줍니다. 이때 call이 실행된 횟수를 담을 필드(변수)가 Animal 객체에 필요하고, 그 필드명을 callCount로 했습니다. 근데 callCount의 경우 call()함수에서만 사용되어야하는데, 혹시 상속한 다른 클래스에서 잘못된 방법으로 해당 필드를 사용할까봐 상속한 클래스에서도 사용하지 못하게 Animal 객체 안에서만 쓸 수 있도록 private로 선언하였습니다.
이처럼 추상클래스 안에서만 사용할 필드의 경우, private 키워드를 사용하시면 됩니다.
0
네, abstract class에서는 protected로 해야 realClass에서 extends가 가능합니다. abstract class도 실제로 존재하는 클래스이므로 protected가 아니면 상속이 안 됩니다.
abstract class AbstractClass {
protected readonly a: string = "init";
protected b: number = 1;
c: string = "기본값이 public";
abstract method(a: string): void;
method2() {
console.log(this.a);
console.log(this.b);
console.log(this.c);
}
}
class realClass extends AbstractClass {
method(a: string) {
console.log(this.a);
console.log(this.b);
console.log(this.c);
}
}
const rC = new realClass();
rc.a // 'error';
데코레이터가 현재도 자주 쓰이는 문법인가요?
0
81
2
유틸리티 타입 실제로 구현은 못해도 하나씩 외우면 실무할 때 지장 없겠죠?
0
66
1
매핑 타입은 type에서밖에 안된다고 하네요?
0
65
2
자바에서의 오버로딩과 같은 개념이라고 생각해도 되나요?
0
69
2
filter 함수 반환 타입 네로잉 질문
0
74
2
map<U>(callbackfn: ....) 할때 U는 왜 여기 있는거에요??
0
47
2
ts 컴파일을 위한 type 라벨링 부분
0
46
1
concat 함수 타입 구현 중 질문 있습니다!
0
100
2
filter 메소드 질문
0
53
1
forEach 제네릭 관련 문의
0
60
1
타입 추론 시 가장 넓은 범위로 추론이 되는 건가요?
0
165
1
enum이 javascript로 트랜스파일링될때 사라진다하셨는데요
0
207
1
함수 파라미터 타입 정의 시 ...args: any[]와 ...args: any 의 차이
0
223
1
Flat type에서 ReadonlyArray 타입을 사용하는 이유?
0
157
1
bind type 질문
1
149
1
Lowercase type 관련 질문
0
152
1
key-value 타입 자동추론 질문드립니다
0
266
1
타입스크립트 교과서, p131
0
266
1
타입스크립트 교과서 p122 forEach 메서드 질문
0
232
1
타입스크립트 교과서 p116 , 코드에러남
1
269
1
타입스크립트 교과서 p112 , 코드가 안읽힙니다..
0
266
1
타입스크립트 교과서 p83
1
184
1
타입스크립트교과서 p39 쪽 코드가 이해가 안되요
1
227
1
class 에서 ts의 private vs js의 private field( # )
0
339
1





