2024. 1. 3. 20:46ㆍ내일배움캠프
1월 3일
이제 컴퓨터 앞에 앉자마자 코트카타에서 오늘은 무슨 문제를 풀지 고민을 하는게 익숙해졌다.
오늘의 알고리즘 문제는?
콜라츠 추측!
문제는 그렇게 어렵지 않다
바로 한번 작성해보자
이제 이정도는 간단히 풀 수 있다!
헉 뭐가 문제야...?
진짜 정말 한참을 고민하다 직접 반복문을 돌려보기로 했다.
비주얼 스튜디오로 달려가서 같은 코드를 작성하고 브레이크 포인트를 잡아보고
도대체 무슨 일이 벌어지고 있는건지 알아보자
반복문을 104번째 돌때 temp의 값이 이상하다 왜 그러냐면
너무너무 수가 커져가지고 int 자료형에는 담을수 없는 큰 수였기 때문에 temp의 값이
int자료형의 최소치로 돌아가버린 것이다.
-21억 ~ 21억 정도까지 담을 수 있는데 이걸 뚫고 지나갔단 말이야?
그렇다면 int가 아닌 더 큰 바구니가 필요하게쒀
num을 더 큰 바구니인 long에 담아주고 다시 한번 제출해보자
정답이다!! 생각지도 못한 함정에 빠져 한참을 해맸다...
고작 62만이라는 작은 값이 반복문을 돌다보니 21억 그 이상의 값으로 커져버리는구나...
항상 조심해야지
문제도 풀었으니 이제 다시 C# 공부를 시작해보자
오늘은 클래스에 대해서 좀 딥하게 파고들어보자 그 만큼 클래스는 중요하다.
클래스
클래스란?
- 클래스는 객체를 생성하기 위한 템플릿 또는 설계도 역할을 한다.
- 클래스는 속성과 동작을 가진다. 속성은 필드로, 동작은 메서드로 표현된다.
- 객체를 생성하기 위해서는 클래스를 사용하여 인스턴스를 만들어야 한다.
- 붕어빵틀로 비유하면, 클래스는 붕어빵을 만들기 위한 틀이라고 할 수 있다.
클래스의 구성 요소
- 필드 (Fields): 클래스에서 사용되는 변수를 말한다. 객체의 상태를 나타내는 데이터를 저장하기 위해 사용된다.
- 메서드 (Methods): 클래스에서 수행되는 동작이 정의된다. 객체의 동작을 구현하기 위해 사용된다.
- 생성자 (Constructors): 객체를 초기화하는 역할을 한다. 객체가 생성될 때 자동으로 호출되며, 필드를 초기화하는 등의 작업을 수행한다.
- 소멸자 (Destructors): 객체가 소멸될 때 호출되는 메서드로, 메모리나 리소스의 해제 등의 작업을 수행한다.
구조체와 클래스의 차이점
- 구조체와 클래스는 모두 사용자 정의 형식을 만드는 데 사용될 수 있다.
- 구조체는 값 형식이며, 스택에 할당되고 복사될 때 값이 복사된다.
- 클래스는 참조 형식이며, 힙에 할당되고 참조로 전달되므로 성능 측면에서 다소 차이가 있다.
- 구조체는 상속을 받을 수 없지만 클래스는 단일 상속 및 다중 상속이 가능하다.
- 구조체는 작은 크기의 데이터 저장이나 단순한 데이터 구조에 적합하며, 클래스는 더 복잡한 객체를 표현하고 다양한 기능을 제공하기 위해 사용된다.
스택과 힙이란?
스택과 힙을 알기 위해서는 메모리의 구조를 알아야 한다.
프로그램이 실행되기 위해선 먼저 프로그램이 메모리에 로드 되어야 한다. 또한
프로그램에서 사용되는 변수들을 저장할 메모리도 필요하다.
컴퓨터 운영체제는 프로그램의 실행을 위해 다양한 메모리 공간을 제공하고 있는데
프로그램이 우영체제로부터 할당받는 대표적인 메모리 공간은 4가지가 있다.
코드 영역
메모리의 코드 영역은 실행할 프로그램의 코드가 저장되는 영역이다.
cpu는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리하게 된다.
데이터 영역
메모리의 데이터 영역은 전역변수와 정적 변수가 저장되는 영역이다.
데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸한다.
스택(stack) 영역
메모리의 스택 영역은 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역이다.
함수의 호출과 함께 할당되고 함수의 호출이 끝나면 소멸한다.
스택 영역에 저장되는 함수의 호출 정보를 스택 프레임이라 하며
스택 영역은 푸시(push) 동작으로 데이터를 저장하고 팝(pop) 동작으로 데이터를 인출한다.
스택은 후입선출 방식에 따라 동작하므로 가장 늦게 저장된 데이터가 가장 먼저 인출된다.
스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다.
힙(heap)영역
메모리의 힙 영역은 사용자가 직접 관리할 수 있는 메모리 영역이다(해야만 한다!)
힙 영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.
힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.
생성자와 소멸자
클래스는 생성자와 소멸자라는 특별한 종류의 메서드를 가질 수 있다.
생성자는 인스턴스를 생성할 떄 호출되는 메서드이고,
소멸자는 인스턴스가 메모리에서 해제될 떄 호출되는 메서드이다.
생성자
- 클래스의 인스턴스(객체)를 초기화하고, 필요한 초기값을 설정하는 역할을 수행한다.
- 생성자는 클래스와 동일한 이름을 가지며, 반환 타입이 없다.
- 객체를 생성할 때 new 키워드와 함께 호출된다.
소멸자
- 객체의 사용이 종료되고 메모리에서 해제될 때 자동으로 호출되어 필요한 정리 작업을 수행한다.
- 클래스와 동일한 이름을 가지며, 이름 앞에 ~ 기호를 붙여 표현한다.
- 소멸자는 반환 타입이 없고 매개변수를 가질 수 없다.
- C#에서는 가비지 컬렉터(Garbage Collector)에 의해 관리되는 메모리 해제를 담당하므로, 명시적으로 소멸자를 호출하는 것은 일반적으로 권장되지 않는다.
프로퍼티
프로퍼티
- 프로퍼티는 클래스 멤버로서, 객체의 필드 값을 읽거나 설정하는데 사용되는 접근자(Accessor) 메서드의 조합이다.
- 객체의 필드에 직접 접근하지 않고, 간접적으로 값을 설정하거나 읽을 수 있도록 한다.
- 필드에 대한 접근 제어와 데이터 유효성 검사 등을 수행할 수 있다.
- 프로퍼티는 필드와 마찬가지로 객체의 상태를 나타내는 데이터 역할을 하지만, 외부에서 접근할 때 추가적인 로직을 수행할 수 있다.
프로퍼티 구문
- 프로퍼티는 get과 set 접근자를 사용하여 값을 읽고 설정하는 동작을 정의한다.
- get 접근자는 프로퍼티의 값을 반환하고, set 접근자는 프로퍼티의 값을 설정한다.
- 필요에 따라 get 또는 set 접근자 중 하나를 생략하여 읽기 전용 또는 쓰기 전용 프로퍼티를 정의할 수 있다.
[접근 제한자] [데이터 타입] 프로퍼티명
{
get
{
// 필드를 반환하거나 다른 로직 수행
}
set
{
// 필드에 값을 설정하거나 다른 로직 수행
}
}
자동 프로퍼티
- 자동 프로퍼티는 프로퍼티를 간단하게 정의하고 사용할 수 있는 편리한 기능이다.
- 필드의 선언과 접근자 메서드의 구현을 컴파일러가 자동으로 처리하여 개발자가 간단한 구문으로 프로퍼티를 정의할 수 있다.
[접근 제한자] [데이터 타입] 프로퍼티명 { get; set; }
클래스를 학습하다 스택과 힙이라는 말이 나와 메모리에 대한 기본적인 추가 학습도 진행했다.
정말 복잡하고 무슨말인지 모르겠고 하지만 직접 코드를 써보면서 아 이게 이렇게 동작하는구나
눈으로 보면서 느낌을 받는게 글로만 읽는것보다 훨신 이해가 빨리 되는것 같다.
사실 난 머리가 그렇게 좋은편은 아닌데.... 진짜 이제 머리가 터질것 같다!!
한번에 외우는건 무리가 있겠지만 핵심 키워드만 잘 기억해 뒀다가 실제 코드를 작성할때
이거 어떻게 써먹었더라? 라고 기억이 나질 않는다면 그때 또 찾아보고 두번 찾아보고 세번 찾아보다보면
이 많고 어려운 내용들도 잘 외울수 있겠지?
터질것같은 머리를 부여잡으며 240103-TIL은 여기서 마치도록 하겠다.
'내일배움캠프' 카테고리의 다른 글
240105-TIL (0) | 2024.01.05 |
---|---|
240104-TIL (0) | 2024.01.04 |
240102-TIL (0) | 2024.01.02 |
231229-TIL (0) | 2023.12.29 |
231228 -TiL (0) | 2023.12.28 |