목록개발/c# (17)
파파비의 블로그
C#에서는 메모리구조로 스택과 힙을 사용한다. 그 중에서 스택에 대해 얘기해보려고 한다. 스택은 하나의 쓰레드가 실행될 때 해당 쓰레드에 1MB의 메모리가 할당된다. 스택의 역할은 메서드의 실행, 메서드로 전달하는 인자, 메서드 내에서 사용되는 지역변수 등을 처리 한다. 메소드들도 스택에 의해 관리되는데, 메소드의 끝을 알리는 } 를 만났을 때, 해당 메소드와 관련된 모든 데이터들은 스택에서 해제된다. 1MB가 작게 느껴질 수 있는데, 사실은 상당히 넉넉한 양이다. 그런데 하나의 메소드에서 필요한 저장공간이 1MB를 넘어서게 되면 에러가 생기며 프로그램이 중단된다. 이를 스택오버플로우라고 부른다. 스택오버플로우의 특이한 점은, 어떤 에러라는 정보가 제공되지 않는다는 점이다. 스택에 에러 관련 내용이 저장..
우리가 함수, function or method를 처음배울 때 흔히 쓰이는 예시가 있다. 바로 '더하기' 기능을 가진 함수 예시이다. 위처럼 2개의 정수를 받아 더한 값을 return하는 그런 함수말이다. 그런데 이 함수는 한 가지 아쉬운 점이 있다. 2개의 정수의 합은 잘 구하지만 3개의 정수의 합을 구할 때는 최소 2번의 계산이 필요하다. a+b+c의 값을 구하려면 int sum = Add(a+b); sum = Add (sum+c); 이렇게 말이다. 이게 3개의 정수가 아니라, 여러 개면 더욱 코딩해야하는 줄 수가 늘어난다. 그럴바엔 안쓰는게 나을 것 같다. 이런 불편함을 해결하기 위해, params 라는 키워드가 존재한다. params는 가변매개변수를 구현할 수 있게 해준다. 가변매개함수는 말 그대..
전치리기 지시문은 스크립트들을 효율적으로 관리하는 데에 상당히 좋다. 예를 들면, 유니티로 앱을 개발하는데, ios와 안드로이드 2가지 버전이 필요하다면, 코딩상 약간의 다른 점들 떄문에 프로젝트를 2개로 늘려서 각각 관리해도 되지만 그렇게 되면 유지보수 측면에서 상당히 부담스러울 것이다. 새로 업데이트된 부분이 생기거나, 리팩토링한 부분들이 생기면 똑같이 한 번 더 적용해주어야하고 그러는 과정에서 버그의 리스크는 더욱 올라간다. 전처리기 지시문을 통해서는 하나의 스크립트로 여러가지 버전을 관리할 수 있도록 할 수 있다. 전처리기 지시문은 전처리 상수를 스크립트에 적어주고, 전처리 상수를 속성에 넣거나 빼는 것을 통해서 원할 때 마다 어느 특정부분은 컴파일되고, 어떤 부분은 컴파일 되지 않도록 지시할 수..
객체지향프로그래밍에서 흔히들, 프로퍼티는 private로 설정해야 한다는 얘기를 들어본적이 있을 것이다. 내부적인 값을 외부에 공개하면 여러 리스크들이 존재할 수 있기 때문이다. 그래서 흔히 해당 프로퍼티의 값을 return하는 메소드를 만들고, 해당 프로퍼티의 값을 설정하는 메소드를 만들어두기도 한다. 그런데 이렇게 되면 최소한 프로퍼티의 수 x 2개의 메소드가 필요하다. '최소한'.. 너무 불편하다. 그래서 get, set이라는 것이 존재한다 getter와 setter라고도 한다. 프로퍼티를 설정할 때 곧바로 get, set을 설정할 수 있다. public class Computer { int x { get { return x } set { x = value } } } 이렇게 getter와 sette..
값형식과 레퍼런스형식(참조형식)이 존재한다는 것을 우리는 알고 있다. int, short 처럼 메모리에서 스택 부분에 바로 값이 저장되는 형식을 값형식이라고 하며, 평범한 class의 객체나, string 객체같은 것들은 일차적으로 스택에 주소가 저장되며 그 주소는 힙메모리에 저장된다. 그래서 우리가 레퍼런스 형식의 객체를 호출하면 우리는 먼저 스택으로 가서 주소를 확인한 후, 힙 메모리에 가서 정확한 값을 확인한다. 참고로 힙메모리는 GC(가비지 컬렉터)에 의해 컨트롤 되어서, 종종 GC가 발동할 때면 비용이 크게 들어 잠깐씩 멈출 수 있다. 이제 우리가 이런 것들을 메소드에 넘길 때, 값들은 어떻게 적용되는 걸까? 전달된 값을 그대로 사용할까 아니면 따로 복사해서 사용하는 것일까? c#에서는, 기본적..
c#에서 모든 배열들은 System.Array를 상속 받았다. 그래서 Array class의 메소드나 프로퍼티를 공유하는데 쓸모있는 것들을 파악해보자 Length (인스턴스 프로퍼티) Sort (정적 메소드) Copy (정적 메소드) System.Array는 ValueType을 상속하지 않았다. 한마디로 참조형 타입이라는 것!
c#에서 가장 상위의 class는 오브젝트 클래스이다. 1. 클래스를 만들 때 아무런 상속 표시를 하지 않는다면 자동으로 object class를 상속하게 된다. 2. object는 참조형 class이다. 그러나 하위에 valuetype이라는 class를 만들고 이를 상속하는 class들은 전부 값형식이다. 3. object는 c#의 키워드이다. 닷넷프레임워크 형식은 System.Object이다. 그런데 보통 System 네임스페이스를 사용하는 경우가 많아 Object만 쳐도 되는데, 그래서 object랑 Object랑 뭐가 다른지 궁금하게 느껴졌을 수도 있는데, 사실은 둘이 같다. 4. object는 4개의 함수가 구현되어있다. - ToString, GetType, GetHashCode, Equals ..
형변환에 대해서 저번 글에 적어둔 내용을 보면 명시적 형변환을 할 경우, 잘 못 했을 경우 컴파일 단계가 아닌 런타임에서 에러를 발생할 수도 있다. 이것은 프로그래밍 과정에서 큰 비용을 가져온다. 그래서 그 해결책으로 나온 것이 as 라는 키워드이다. as는 컴파일단계에서 에러를 발생시키나? 그것은 아니고, as로 형변환을 할 경우, 성공하면 형변환된 객체가 반환되고 실패하면 null을 반환한다. 에러로 멈추는 것이 아니라서 처리만 잘 해준다면 더욱 효율적으로 처리가 가능하다. 그래서 예를 들어 부모 class의 computer와 그의 자식 class notebook 이 있다고 가정하면 computer com = new computer(); notebook nt = com as notebook; if(n..