sealed

클래스나 메서드를 상속하지 못하도록 하여 오버라이딩을 방지한다.

sealed로 선언된 클래스는 다른 클래스에서 상속받을 수 없으며 메서드의 경우 해당 클래스에서만 사용이 가능하다.

 

sealed 클래스 선언

sealed class MyClass
{
	//
}

이 클래스는 다른 클래스에서 상속받을 수 없으며 이 클래스를 파생 클래스로도 사용할 수 없다.

 

 sealed 메서드 선언

class MyBaseClass
{
	public virtual void MyMethod() {}
}

class MyDerivedClass : MyBaseClass
{
	public sealed override void MyMethod() {}
}

MyMethod 함수는 MyDerivedClass에서 오버라이딩되고 이후 sealed로 선언된다. 따라서 MyDerivedClass를 상속하는 다른 파생 클래스에서 MyMethod를 오버라이딩할 수 없게 된다.

 

일반적으로 클래스를 마지막으로 봉할 때 사용하는 키워드로 최종적인 구현을 제공하는 클래스에서 사용된다.

파생되어 추가되는 내용이 필요하지 않게 하거나 해당 기능을 변경하거나 확장하려는 경우를 방지해 클래스의 안정성을 보장한다.

 

예를 들어 C#의 String 클래스의 경우 sealed로 선언되어 있어 개발자가 해당 클래스를 상속하거나 수정할 수 없도록 만들어 클래스의 안정성을 보장하도록 한다.

728x90
반응형

아시는 분께서 최근에 베트남에 다녀오셨는데 선물로 커피를 받았다. 평소에도 커피를 즐겨 먹어서 반가운 선물이다.

 

베트남 콘삭 커피

 

베트남이 커피로 유명하다는 사실도 이번에서야 알게 되었다.

프랑스의 식민 통제를 대략 100년 정도 받으면서 이때 커피 문화도 발전하게 되었다고 한다

 

패키지에는 제조사의 페이지로 보이는 주소가 적혀있어서 들어가 보았다.

 

CONSOC

 

해당 페이지에는 판매 중인 커피의 종류들이 보인다. 그리고 사이트가 한글을 지원한다는 점에서 한국 소비자층이 꽤나 있구나 싶었다. 

 

제조사는 TRUONG SON COOPERATIVE(쯔엉 성)인 거 같은데 해당 커피에 대해서 더 자세히 찾아보니 해당 커피 제조사와 인터뷰한 기사를 찾을 수 있었다.

 

베트남 콘삭 커피를 만드는 사람들

 

글에서는 해당 커피에 대해서 다루고 있다.

기사에는 이 부분에 대해서도 제조사와 인터뷰한 내용이 있다. 일단 다람쥐똥 커피는 존재하지 않는다 대신 족제비 똥 커피는 존재하긴 하는데 해당 커피와는 관련이 없다. 콘삭커피는 커피를 연구하다가 헤이즐넛 향을 첨가하게 되었고 여기서 특유의 맛을 얻게 되었다고 한다. 그래서 다람쥐가 헤이즐넛을 좋아한다는 점과 귀엽고 친숙하기 때문에 커피 이름을 Con sóc(=다람쥐)이라고 짓게 되었다고 한다. 

 

나도 패키지에서 가장 눈에 띄는 게 커피를 먹고 있는 다람쥐 그림이었는데 그 다람쥐 그림 때문에 루왁커피처럼 다람쥐의 배설물로 만든 것인가 생각했다. 거기다 이름도 다람쥐다 보니 베트남어를 아는 사람이었다면 더 다람쥐똥 커피가 연상되었을 것 같다. 실제로 커피를 검색해 보면 다람쥐똥 커피로 더 알려져 있어서 사람들 생각은 다 비슷하구나 생각했다.

 

필터를 통해서 내려 마시는 방식으로 커피를 내릴 때 풍기는 찐한 향이 좋다. 맛도 굉장히 부드럽고 커피의 향도 많이 느낄 수 있는 맛있는 커피다.

패키지에는 설탕스틱도 있는데 평소에는 커피를 마실 때 추가로 넣어서 먹지 않는데 그래도 있으니 넣고 먹어봤더니 달달하니 맛이 괜찮았다.

 

 

커피를 내려 먹어야 해서 번거로움이 있지만 향이 좋아서 그 과정마저 즐기면서 마실 수 있었다.

향도 좋고 맛도 좋고 패키지도 깔끔하고 귀여운 다람쥐도 있기 때문에 커피를 좋아하는 사람에게는 좋은 선물이라고 생각된다.

728x90
반응형

'Life' 카테고리의 다른 글

사이버 나무  (0) 2023.05.11
오랜만에 만족스러운 영화관람! 슈퍼 마리오 브라더스  (0) 2023.05.08
티스토리 단축키  (0) 2023.03.30
장 줄리앙 전시회 - 그리고 거기  (1) 2023.03.27
재벌집 막내아들  (0) 2023.01.08

readonly

변수 앞에 위치하면 해당 변수는 읽기 전용이 되어 해당 변수가 정의된 클래스나 구조체, 메서드 등에서만 수정이 가능하며 readonly로 선언된 변수는 선언할 때 또는 생성자에서 값을 할당해야한다.

 

public class MyClass
{	
	readonly int myReadOnlyInt;
    public MyClass(int value)
    {
    	myReadonlyInt = value;
    }
}

위 코드에서 myReadOnlyInt는 읽기 전용으로 선언되었기 때문에 생성자에서 값을 할당한 이후에는 변경이 불가능하다.

 

상수를 선언한다는 점에서 const와 비슷한데 둘의 차이를 비교할 필요가 있다.

 

const vs readonly

초기화 방법

const와 readonly는 초기화 방법에서부터 차이가 있다.

// 반드시 선언과 동시에 초기화 필요
const int constNum = 10;

// 선언에서 뿐만 아니라 생성자에서 값을 할당해서 초기화 할 수 있다.
readonly int readonlyNum_1 = 10;
readonly int readonlyNum_2;
public MyClass(int value)
{
	readonlyNum_2 = value;
}

 

사용 범위

const는 클래스 멤버 또는 데이터 형식 멤버로 선언할 수 있지만 클래스 멤버 중에서도 인스턴스 멤버는 const 키워드를 사용할 수 없다. 즉 인스턴스 변수, 인스턴스 메서드 등에서는 const 키워드 사용이 불가능하다.

public class MyClass
{
    public const int number = 10;
    public void Test()
    {
        int test = number;
    }
}

public static class MyStaticClass
{
    public const int number = 20;
    public static void Test()
    {
        int test = number;
    }
}

public class OtherClass()
{
    public void TestMethod()
    {
        MyClass instance = new MyClass();
        // 접근 불가능함
        int test1 = instance.number;
        
		// static 클래스 인스턴스화 안됨
        //MyStaticClass staticInstance = new MyStaticClass();
        // 직접 호출가능
        int test2 = MyStaticClass.number;
    }
}

 

실행시간

const는 컴파일 시간에 값이 결정되기 때문에 런타임 성능이 상대적으로 좋다.

readonly는 런타임에 값을 할당할 수 있기 때문에 const보다는 조금 더 느릴 수 있다. 

그렇기 때문에 런타임에 값을 결정해야할 경우에만 readonly를 사용하고 그 이외에는 const를 사용하는게 낫다.

 

public class MyClass
{
    public const int number = DateTime.Now.Year; // 컴파일 에러 발생
    public readonly int year = DateTime.Now.Year; // 실행 시간에 값이 결정됩니다.
}

 

const와 readonly의 가장 큰 차이점은 값이 결정되는 시점이다.

const는 컴파일 타임 readonly는 런타임

 

따라서 애초에 고정된 값이라면 const를 사용하지만 인스턴스가 생성될 때 값을 할당하고 그 이후에 변경되지 않도록하려면 readonly를 사용하면된다.

728x90
반응형

+ Recent posts