본문 바로가기

C#

C# -STACK, HEAP/ARRAY.CLEAR/

반응형

Stack vs Heap

Stack은 메소드가 실행될 때 변수가 push(입력)되며 실행이 종료될 때 pop(해제)된다. 
heap은 new혹은 c에서는 malloc 될 때 만들어지며 자바는 가비지 컬렉션에 의해 사용되지 않을 때 자동으로 해제되고, c에서는 직접 관리해서 해제 해줘야 한다.

스택

스택이란 무엇입니까? 이것은 각 기능 (기능 포함)에 의해 생성 된 임시 변수를 저장하는 컴퓨터 메모리의 특별한 영역입니다 main(). 스택은 "LIFO"(last in, first out) 데이터 구조로 CPU에 의해 관리되고 최적화됩니다. 함수가 새 변수를 선언 할 때마다 스택에 "푸시 (push)"됩니다. 그런 다음 함수가 종료 될 때마다 해당 함수에 의해 스택에 푸시 된 모든 변수가 해제됩니다 (즉, 삭제됩니다). 스택 변수가 해제되면 다른 스택 변수에서도 해당 메모리 영역을 사용할 수있게됩니다.
스택을 사용하여 변수를 저장하면 메모리가 관리된다는 이점이 있습니다. 메모리를 손으로 할당 할 필요가 없으며 더 이상 필요하지 않으면 메모리를 확보 할 필요가 없습니다. 게다가 CPU가 스택 메모리를 효율적으로 구성하기 때문에 스택 변수를 읽고 쓰는 속도가 매우 빠릅니다.
스택을 이해하는 핵심 은 함수가 종료 되면 모든 변수가 스택에서 팝 아웃된다는 것입니다 (따라서 영원히 손실됩니다). 따라서 스택 변수는 사실상 국부적 입니다. 이것은 앞서 가변 범위 또는 로컬 변수와 전역 변수 로 알려진 개념과 관련이 있습니다. C 프로그래밍의 일반적인 버그는 일부 함수 내부의 스택에서 생성 된 변수에 액세스하려고 시도하는 것입니다 (함수가 종료 된 후).
스택의 또 다른 특징은 스택에 저장할 수있는 변수의 크기에 제한이 있다는 것입니다 (OS에 따라 다름). 힙에 할당 된 변수의 경우는 그렇지 않습니다 .
스택을 요약하려면 다음을 수행하십시오.
함수가 푸시 (push) 및 팝 (pop) 로컬 변수로서 스택이 커지고 축소됩니다.
메모리를 직접 관리 할 필요가 없습니다. 변수는 자동으로 할당되고 해제됩니다.
스택에 크기 제한이있다.
스택 변수는 생성 된 함수가 실행되는 동안에 만 존재합니다.

힙은 자동으로 관리되지 않고 CPU가 엄격하게 관리하지 않는 컴퓨터 메모리 영역입니다. 더 자유롭게 떠 다니는 메모리 영역입니다. 힙에 메모리를 할당하려면 malloc()or 을 사용해야하며 calloc(), 내장 C 함수입니다. 힙에 free()메모리 혹은 자바에서는 new를 하면 더 이상 필요하지 않은 메모리를 할당 해제해야합니다. 이렇게하지 않으면 프로그램에 메모리 누수가 발생 합니다. 즉, 힙의 메모리는 여전히 따로 설정됩니다 (다른 프로세스에서는 사용할 수 없습니다). 디버깅 섹션에서 볼 수 있듯이 valgrind 메모리 누수를 감지하는 데 도움 이되는 도구 가 있습니다. 하지만 자바는 가비지 컬렉션을 이용한다.
스택과 달리 힙에는 (컴퓨터의 명백한 물리적 한계를 제외하고) 가변 크기에 대한 크기 제한이 없습니다. 힙 메모리는 포인터  사용 하여 힙의 메모리에 액세스 해야하기 때문에 읽기와 쓰기가 약간 느립니다 
스택과 달리 힙에 작성된 변수는 프로그램의 모든 함수에서 액세스 할 수 있습니다. 힙 변수는 본질적으로 범위가 전역입니다. 

간단하게 말하면 변수의 범위는 아래와 같이 나뉩니다.
1. 지역변수 vs 전역변수
2. 지역변수에는 static변수라는게 없습니다. 이유는 스택(메소드 내부)안의 변수는 기본적으로 실행시에 메모리에 할당되고 static변수는 JVM실행시에 메모리에 바로 할당되어 JVM종료시 까지 메모리에 떠 있어야 하기 때문에 이론적으로 맞지 않습니다.
3. 지역변수에는 일반 변수만 존재할 수 있습니다.
4. 전역변수에는 static 전역변수와 heap 전역변수로 나뉩니다.
 - 전역변수의 의미는 쉽게 말해 스택에 들어가지 않는 모든 변수를 말합니다.
 - 전역변수 중 static이 붙어 있는 변수는 JVM실행시 부터 클래스 메모리에 할당됩니다.
 - 전역변수 중 static이 붙어 있지 않는 변수는 동적으로 new 될때 heap에 할당됩니다.
5. heap변수는 new가 되고 난 뒤 부터 공유해서 사용가능합니다. static 변수는 처음부터 공유해서 사용가능합니다.
6. static 메소드 안에서 일반변수를 선언 및 초기화하는 것은 가능하지만 사용하는 것은 불가능합니다.
그 이유는 static메소드는 JVM실행시 클래스 메모리에 메소드의 주소가 뜹니다. 그 안에 내용은 static메소드가 실행될 때 push되게 되는데 객체가 생성되기 이전 시점에 static메소드가 실행되면 일반변수를 찾을 수가 없으니 당연히 사용하지 못합니다. 
7. 일반 메소드 안에서 static변수를 선언하는 것은 불가능하지만 사용하는 것은 가능합니다.
그 이유는 일반 메소드가 실행되려면 기본적인 조건이 객체가 생성되어야 합니다. 그렇다면 객체가 생성되어야 실행될 수 있는 메소드 안에 static변수를 선언하는 것은 이론상 맞지 않습니다. 왜냐하면 static변수는 JVM실행시 바로 클래스 메모리에 할당되어야 하는데 일반 메소드는 누군가가 new를 해줘야 메모리에 뜨기 때문에 서로의 타이밍이 맞지 않는 것입니다. 
결국 static변수가 일반 메소드 안에서 선언되어 버리면 일반메소드가 실행되기 전까지는 static변수가 선언될 수 가 없으니 JVM이 처음 실행될 때 static변수를 클래스 메모리에 할당할 수 없는 것입니다.
하지만 static변수를 사용하는 것은 가능합니다. 왜냐하면 객체가 생성되기 전시점이든 생성된 후 시점이든 static변수는 항상 떠 있기 때문에 언제든지 찾을 수 있기 때문입니다. 

Stack vs Heap 장단점

스택

매우 빠른 액세스
변수를 명시 적으로 할당 해제 할 필요가 없습니다.
공간은 CPU에 의해 효율적으로 관리되고 메모리는 단편화되지 않습니다.
지역 변수 만
스택 크기 제한 (OS에 따라 다름)
변수의 크기를 조정할 수 없습니다.

변수는 전역 적으로 액세스 할 수 있습니다.
메모리 크기 제한 없음
(상대적으로) 느린 액세스
효율적인 공간 사용을 보장하지 못하면 메모리 블록이 할당 된 후 시간이 지남에 따라 메모리가 조각화되어 해제 될 수 있습니다.
메모리를 관리해야합니다 (변수를 할당하고 해제하는 책임이 있습니다)
변수는 C언어 realloc() or 자바 new

 

 

public static void clear (Array array, int index, int length);

int {1,2,3,4,5}

Array .clear (array,2,1);

3번을 찾아내서 지워 준다 : "2번방을 청소해주세요"

 

Array.Clear(Array, Int32, Int32) 메서드

정의

네임스페이스:System어셈블리:System.Runtime.dll

배열의 각 요소 형식의 기본값으로 요소의 범위를 설정합니다.

C#복사

 

public static void Clear (Array array, int index, int length);매개 변수

arrayArray

포함된 요소를 지울 배열입니다.

indexInt32

지울 요소 범위의 시작 인덱스입니다.

lengthInt32

지울 요소의 개수입니다.

예외

ArgumentNullException

array이(가) null인 경우

IndexOutOfRangeException

index가 array의 하한값보다 작습니다.

또는 length가 0보다 작은 경우

또는 index  length 합계가 array의 크기보다 큽니다.

 

위의 4가지 중 아무거나 써도 된다. 

C언어를 여기 저기에서 다 쓰고 만들어 내다 보니 규율을 정하자는 말이 나오기 시작했고 

그나마 정규화 된것이 Main ENTRY POINT 위 4가지 

CHAR = 2 byte

BYTE =1byte

SHORT =2 byte

INT =4 byte

LONG =8 byte

 

바탕화면

> 빼고  한카 띄어서 입력

 

화면 지우기 cls

 

IDE :통합 개발 환경 :개발하는 애들을 모아 놓은 환경 (VS2019) -그중 하나가 C#

객체지향 문법 

주위를 둘러보자 현실세계의 모든 것들이 객체이다 예를 들어 책에 속하는 사물을 볼 수 있는데 걸리버 여행기 라는 소설이 종일로 인쇄돼 책꽂이에 꽂혀 있다면 우리는 그 것을 책이라고 부른다 그소설이사람들의 입을 통해 구전되기만 했다면 우리는 책에 속하는 거리버 여행기를 볼 수 없었을 것이다. 책이라는 개념을 좀 더 파헤쳐 보자 어떤 공통적인 특징을 만족해야 책이라고 부를 수 있을 까 ? 당연히 책에는 제목이 있다 이와 마찬가지로 식별자 내용 저자 페이지 수가 책에 포함 될 수 잇다 더 나아가서 이러한 특징을 C#의 자료형으로 나타내는 것도 가능한데, 책이라는 개념을 구체적으로 정리하면 

제목      string

식별자    decimal

내용        string

저자        string

페이지수   int

 

이처럼 특정 사물의 특징중에는 자료형으로 표현할 수 있는 여러가지 값이 존재하고 객체지향에서는 이를 어트리뷰트 하지만 사물의 특징에는 속성만 있는 것은 아니다. 인간이라는 범주에 속하는 영희라는 객체가 책과 상호작용할 때 대표적으로 책을 펼치고 책을 덮는다는 행위를 한다 이러한 행위까지 포함한다면 책의 경우 다음과 같은 특징으로 정의 할 수 있다. 다시 한번 주위를 둘러보자. 비단 책뿐만 아니라 현실세계의 모든 것을 이런식으로 정의 할 수 있는 데 이것이 바로 객체지향의 핵심개념이다 그리고 개념을 프로그래밍에 적용한것을 OOP라고 하고 객체지향프로그래밍이 가능한 언어를 객체지향 프로그래밍 언어라고한다. 

 

클래스 객체지향에서 사용되는 단어를 조금 더 세밀하게 정의하고 이를 C#의 문법과 연결해 보자 앞에서 살펴본 "책"이라는 개념을 일종의 틀과 같고 이틀을 기반으로 실체화된 걸리버여행기를 객체 또는 인스턴스라고 한다 

책에는 여러가지 종류가 있다 . 객체 인스턴스 책이라는 범주를 C#에서는 타입이라고 한다.  int, short, long

앞서 말한 기본 타입 형  외에 별도로 객체지향 개념을 받아들여 새롭게 타입을 정의해야만할까 ? 그것을 기본자료형에 속하는 타입만으로는 현실 세계를 모델링하기에 역부족이기 때문이다 사실 기본자료형읜 태생 자체가 사람이 아닌 컴퓨터의 입장에서 메모리의 바이트 수에 따라 나눠진 형식에 불과하므로 표현의 한계가 있는 것은 당연한 결과이다. 객체지향 프로그래밍 언어는 기본타입외에 개발자가 원하는 모든 객체의 타입을 새롭게 정의해서 사용할 수 있게 한다.

c#에서도 타입을 정의 할 수 있는데 이를 위해 class예약어가 제공된다. 

 

타입 생성 

book gulliver = new book()  --- book 타입이 만들어 지는거지 

이걸로 book.속성 or행위 불러 올 수 있음 (객체)

gulliver.Author = "jonathan"  =string author // 동일한건데 내가 정한 이름으로 타입을 만들어 버림!

근대 그냥 이렇게만 작성을하면 컴파일을 하면 서 오류가 발생된다. 왜냐하면 기본적으로 객체의 필드는 외부에서 접근을 할 수 가 없다. class book / class program 만약 접근하고 싶다면 명시적으로 public이라는 예약어를 사용해 클래스의 필드를 다음과 같이 정의해야한다. 

public string title

 

class joon

{

//속성정의

//행위정의

}

cladd book

{

string title

}

클래스로 정의된 타입은 string 처럼 모두 참조형으로 불류 되므로 book 타입을 사용하려면 우선 new 연산자로 메모리 할당을 해야한다.

book gulliber = new book();

 

CLASS = 틀 !

객체란 무엇이냐 !

예) 스마트 팩토리 반 

다른 반과 차별화 되는 부분 을 확인

(붕어빵 틀)[CLASS]  - (붕어빵) [객체]

변수 - 객체

class ***     -행위 정보(메쏘드) 와 상태 정보(변수)로 구성 되어 있다. 

{

 

}

 

 

 

OOP -객체 지향 프로그래밍 언어 

클래스 

객체지향에서 사용되는 단어를 조금 더 세밀하게 정의하고 이를 문법과 연결해 보자 앞에서 

책이라는 개념은 일정의 틀과 같고 이틀을 기반으로 셀체화된 걸리버 여행기를 객체 쪼는 인스턴스라고한다 

현실세계를 모두 모델링하기에는 역부족이기 때문에 사용자가 그때그때 새롭게 정의해서 사용할 수 있게 한다, 

여기서 사용할 수 있는 예약어가 CLASS

 

STRING ,CLASS 변수의 경우 값형식과 참조형식의 유일한 차이점은 바로 값을 스택에 저장하느냐 힙에 저장하느냐에 있다 . 앞서 설명한 대로 값 형식은 그변수의 타입에 해당하는 값을 스택에 저장하지만 참조형식을 위한 변수는 그값을 담기 위해 별도로 힙영역의 메모리를 할당하고 스택의 변수 값은 반드시 히의 데이터 주소를 가리키게 된다. 

 

생성자 

c#에는 특별한 용도의 메서드가 있다 이절에서 는 그중 하나인 생성자를 알아볼텐데 클래스에 생성자 메서드를 추가하면 객체가 생성되는 시점에 해당 메서드가 자동으로 호출된다. 이런 점에서 생성자는 다른 여타 메스드와 구별되는 특징이 있다.

반응형