본문 바로가기
typescript

[typescript] class 접근제한자, 정적멤버(static), 추상클래스(abstract)

by 남민섭 2023. 2. 24.
728x90
반응형

클래스 구문

클래스는 필드와 메소드로 구성되어있다

class Animal {
	constructor(kind){
		this.kind = kind;
	}
}

class Cat extends Animal {
	constructor(name, age, kind){
		super(kind)
		this.name = name;     //여기를 필드라고 함
		this.age = age;
	}
	printName(){
		console.log(this.name)
		this.sound();
	}
	sound() {
		console.log("야옹")
	}
}

 

타입스크립트 클래스 구문

class Animal {
	kind: string
	constructor(kind: string){
		this.kind = kind;
	}
}

class Cat extends Animal {
	name: string;
	age: number
	constructor(name: string, age: number, kind: string){
		super(kind)
		this.name = name;     //여기를 필드라고 함
		this.age = age;
	}
	printName(){
		console.log(this.name)
		this.sound();
	}
	sound() {
		console.log("야옹")
	}
}

 

 

접근제한자!!!!!!!!!!!!!!!!!!!!!!!

public

의미: 어디서나 자유롭게 접근가능(생략가능) 
클래스 내부에서 접근, 인스턴스 접근가능, 자식 클래스에서도 접근가능
범위: 속성, 메소드

protected(보호)

의미 : 내 클래스 내부, 자식 클래스 내부에서 접근가능 (인스턴스 접근 안됨)
범위 : 속성, 메소드

private(사적인)

의미 : 내 클래스 내부에서 접근가능(자식클래스 접근안됨, 인스턴스 접근 안됨)

 

인스턴스란 : 클래스를 만든 객체를 인스턴스라고 함

 

여태까지 public은 생략되어서 못봤을것이다 생략된것 적어주면 밑에 구문처럼 나타낸

예시 구문) 위 타입스크립트 구문과 비교해볼것 

class Animal {
	kind: string
	constructor(kind){
		this.kind = kind;
	}
}


class Cat extends Animal {
	public name: string;
	public age: number
	constructor(name, age, kind){
.
		super(kind)
		this.name = name;     //여기를 필드라고 함
		this.age = age;
	}
	public printName(){
		console.log(this.name)
		this.sound();
	}
	public sound() {
		console.log("야옹")
	}
}

 

접근제한자 실습

public

class ClassAnimal {
    public name: string;  //!!!!!부분 바뀜 현재 public !!!!
    constructor(name: string) {
        this.name = name;
    }
}

class ClassCat extends ClassAnimal {
    public getname() : string {
        return `cat name is ${this.name}`;
    }
}

let cat = new ClassCat("레오");
console.log(cat.getname())
cat.name = "몽이"

 

protected

class ClassAnimal {
    protected name: string;  //!!!!!부분 바뀜 현재 protected !!!!
    constructor(name: string) {
        this.name = name;
    }
}

class ClassCat extends ClassAnimal {
    public getname() : string {
        return `cat name is ${this.name}`;
    }
}

let cat = new ClassCat("레오");
console.log(cat.getname())
cat.name = "몽이"

 

 

private

class ClassAnimal {
    private name: string;  //!!!!!부분 바뀜 현재 private !!!!
    constructor(name: string) {
        this.name = name;
    }
}

class ClassCat extends ClassAnimal {
    public getname() : string {
        return `cat name is ${this.name}`;
    }
}

let cat = new ClassCat("레오");
console.log(cat.getname())
cat.name = "몽이"

 

 


인스턴스 멤버 - 인스턴스 필드, 인스턴스 메소드로 구성(계속 사용해왔음)

 

추가내용!!!!!!!!!

정적 멤버 - 정적필드, 정적 메소드 static붙이면 정적 멤버임!!! (객체 접근불가)

 

접근방법!!!!!

인스턴스

클래스  →  객체(클래스의 인스턴스) →  인스턴스 멤버

 

let cat = new Cat('레오')

cat.name   (인스턴스 멤버임)


정적

클래스 →  정적 멤버

 

let cat = new Cat('레오')

ClassCat.name2

 

정적 예시)

class ClassAnimal {
    protected name: string;
    //정적 멤버 변수 선언
    //this 나 인스턴스 접근할 수 없음. 접근방법 클래스명.변수명
    static eye = 2;
    constructor(name: string) {
        this.name = name;
    }
    //정적 메소드 클래스명.메소드명
    static eat():void{
        console.log("먹는다");
    }
}

let cat = new ClassCat("레오");
//정적멤버 접근방법
console.log(ClassAnimal.eye)  //2
ClassAnimal.eat() //먹는다

추상클래스

추상클래스는 상속만 가능하고 인스턴스(객체)를 생성할 수 없다

사용 키워드:  abstract

 

추상 메소드

메소드의 이름만 선언하고 구체적인 기능은 상속받는 쪽에서 구현한다.
상속받는 클래스는 모두 다 같은 이름의 메소드를 가지며
구현은 각각 다르게 할 수 있다.

 

구문)

abstract class Person {
	name: string;
	construtor(name){
		this.name = name;
	}
	abstract work(): void;  !!!!!추상메소드는 선언부만 있음!!!!!//선언부
}

class Teacher extends Person {
	work():void {    !!!!! 추상메소드는 상속받은 쪽에서만 구현부 있음!!!!!!  //선언부
		console.log("가르키는 일을 합니다")    //구현부
	}
}

class Engineer extends Person {//선언부
	work():void{
		console.log("가르키는 일을 합니다"    //구현부
	}
}

const person1 = new Person() 는 생성(사용) 불가

 

실습

//선언,상속만 할수 있음
//인스턴스 생성할 수 없음!!!!!!
abstract class Person{
    name: string;
    constructor(name: string) {
        this.name = name;
    }
    abstract work(): void
}
class Teacher extends Person {  
    work():void {
        console.log("가르킵니다")
    }
}

class Engineer extends Person {
    work(): void {
        console.log("엔지니어 입니다")
    }
}

let person1 = new Person("호호"); !!!!!!!생성(사용) 불가능!!!!!

!!!!!!!!!!!!상속받은 메소드로 생성자를 만들수 있음 !!!!!!!!!!!!!!!

let teacher1 = new Teacher("bella");
teacher1.work();  //가르킵니다

let engineer1 = new Engineer("lora")
engineer1.work();  //엔지니어 입니다

 

 

 

728x90
반응형

'typescript' 카테고리의 다른 글

[typescript] react-typscript(usereducer)  (0) 2023.02.24
[typescript]react - typescript(설치, useState)  (0) 2023.02.24
[typescrip] Generic(제네릭)  (1) 2023.02.24
[typescript] Enum 열거형 타입  (0) 2023.02.24
[typescript] 배열타입  (0) 2023.02.24

댓글