공부/Unity

[Unity] abstract, 인터페이스, struct, 메모리

굴러다니다니 2025. 5. 23. 09:56

abstract: 추상화 클래스

부모 클래스에서 선언만 해두면 되고, 자식 클래스에선 필수로 이에 대한 설명을 해줘야 된다

 

abstract class로 선언한 Animal의 abstract 함수는 이를 상속하는 자식 클래스에서 필수적으로 정의해줘야 한다

 

이전에 만든 동물 클래스에 새 종류에 관해 날기를 추가하고 싶은데

날기 함수를 넣어버린 다면 동물로 선언한 객체들이 다 날기라는 함수를 쓸 수 있어버린다

날기가 가능한 조류 클래스를 만들고, 비둘기, 참새 클래스는 조류를 상속하게 했다면

 

조류가 아닌데 나는 박쥐 / 조류인데 못 나는 펭귄은 어떻게 처리할 것인가?

 

클래스는 계층적이지만, 인터페이스는 기능이라고 생각하면 된다

계층에 상관없이 사용한다

 

인터페이스는 메소드 선언만 가능하고, 멤버 변수를 가지는 것은 불가능하다

계층 관계를 넘어선 기능을 넣거나 강제로 구현할 때 사용한다

 

클래스 vs 인터페이스

클래스: 상속 개수 1개

인터페이스: 상속 여러번 가능

 

as 연산자를 통해 인터페이스를 가지고 있는지 확인한다

이렇게 실행한다면 I날수있어로 p를 강제 캐스팅 한 것이기에 run time exception 오류가 난다

 

as는 안전한 타입 캐스팅(실패시 null)

is는 타입 캐스팅이 가능한지 여부 확인(true/false)


정적 멤버 변수, 정적 메소드 static

정적 멤버 변수 static

클래스 멤버 변수에 static을 추가한다면 객체를 생성하지 않고 멤버 변수에 접근할 수 있다

Profile.공유 라는 식으로 접근한다

static 변수는 정적 영역에 클래스별로 생성되고, 객체는 힙 영역에 생성된다

Profile.공유는 정적 변수 영역에 하나만 생성되고, 멤버 변수는 힙 영역에 인스턴스 별로 생성되기에 Profile.공유는 항상 같은 값을 공유한다.

정적 영역은 프로그램이 종료될 때 사라진다

힙 영역은 프로그램 실행 중 참조하는 곳이 없을 때 사라진다

 

프로그램이 실행하는 동안 사라지지 않거나 하나만 생성하고 싶을 때 정적 변수를 사용한다 (ex: 싱글톤 패턴)

 

정적 메소드 static

정적 메소드는 클래스명을 통해서 호출 -> 객체와 무관하게 동작

객체를 통하지 않아 this, 멤버 변수에 접근이 불가능

 

객체에 무관하게 동작하기에 라이브러리, 유틸리티 클래스에서 주로 사용한다

정적 메소드에서 정적 변수는 접근 가능

 

구조체 Struct

형식의 인스턴스가 작고 수명이 짧거나 다른 개체에 포함된 경우 클래스 대신 구조체가 낫다

변경이 불가능, 자주 입력 X, 상속 X, 멤버변수 디폴트 값 X, 인스턴스 방법: new 연산자

 

struct: 스택 영역, value type

class: 힙 영역, ref type

struct로 선언한 sp는 값이 value type이라 바뀌지 않았고,

class로 선언한 cp는 ref type이라 힙 영역에 있는 변수를 바꿔 0, 0으로 출력된다

 

메모리

스택, 힙

힙 영역: new를 쓴 메모리 할당은 힙에 할당 (class, string, 객체)

메모리 생성 / 파괴를 프로그래머가 제어

 

*더 공부해야할 내용

스택 영역: 함수 실행에 필요한 메모리 (로컬, 매개변수)

메모리 생성 / 파괴를 함수 시작 / 종료시 자동으로 제어 

로컬 변수는 스택에 저장, 객체는 힙에 저장

value type : 값을 저장

(bool, byte, int, float char, enum, struct ,,,)

ref type : 주소를 저장

(string, array, class ,,,)

 

* value type을 ref type으로 전달하고 싶다면 ref 키워드를 붙이면 된다

 

* out 파라미터는 함수내에서 생성한 주소를 넣어 준다

대신 out은 파라미터에 값을 반드시 할당해야 한다

 

out을 사용해 a의 값을 할당해 a+b 연산을 수행할 수 있다

다만 TryParse를 이용한 결과가 실패한다면 false를 반환한다

 

박싱: 값을 힙에 넣는 것 (성능 부담, 시간 걸림)

언박싱: 힙에 있는 내용을 스택에 올리는 것

string 타입은 ref type이라 박싱이 발생하지 않아 value type을 문자열로 반환하면 박싱을 우회할 수 있다

 

 

 

 

728x90
반응형