본문 바로가기

프로그래밍 일반/JAVA

[C++/JAVA] 변수부터 배열, 구조체까지 발전 과정

모든 프로그래밍은 변수와 메소드로 이루어져있습니다.
그리고 변수와 메소드를 기능별로 묶은 것을 클래스라고 합니다.
일종의 레고나 부품처럼 끼워 맞추면서 프로그래밍을 진행하게 됩니다.
이번에는 변수가 왜, 나왔고 어떻게 발전되는지를 알아보겠습니다.

 


변수 이전에는 상수가 있었습니다.
그런데, 상수는 constant number 常數 항상 같은 값을 갖은 수 이기 때문에,
프로그래머가 직접 값을 바꿀 수가 없었습니다. 
프로그램을 만들려면 게임을 하는데 점수가 오르는 등의 값이 변화하는 것이 필요합니다.
이를 위해서 변수가 등장했습니다. 변수는 상수에다가 이름을 붙여서 관리를 편하게 해줍니다.

 

상수는 프로세스에서 코드 영역에 저장되고, 변수는 데이터 영역에 저장된다.

#include <stdio.h>
int main(void){
//상수를 직접 호출하는 경우는 코드 영역에서 실행된다.
printf("5"); 
//변수에다가 값을 넣은 뒤 호출하는 경우는 데이터 영역으로 들어가게 된다.
int x = 6; 
printf("%d", x);
}


그런데 int a = 5, int b = 6; int c

 = 7과 같이 똑같은 자료형이 나열되어있으면,
선언하기도 귀찮고 이름을 많이 적어야 하기 때문에 불편함이 많았습니다.
그래서 같은 자료형을 묶어서 관리하기 위해 배열이 등장했습니다.
배열이란 형식이 같은 자료 여러 개가 모여서 새로운 하나를 이루는 형식입니다.
배열에 변수를 선언하면 변수는 여러 요소를 대표하는 첫 번째 요소의 메모리 주소에 식별자가 됩니다.
int arr[5]; 라고 하면 arr이라는 이름으로 데이터를 관리하게 되고,
arr[0]은 해당 데이터 안에 있는 값이 됩니다.

 

#include <stdio.h>
int main(void) {
	int array[5] = { 10,20,30,40,50 };
	
	//배열을 선언한 첫번째 식별자 이므로 아래와 같이 접근 가능
	*array = 60;
	printf("%d\n", array[0]);

	//편의성을 위해서 아래와 같이 접근한다. *array = array[0];이다.
	array[0] = 80;
	printf("%d\n", array[1]);

	//공간 값을 출력해 보면 둘 다 같은 값임을 알 수 있다.
	printf("%p\n", array);
	printf("%p\n", &array[0]);
	return 0;
}

 


그런데 같은 자료형 이외에 연관된 자료형을 선언해야 할 경우가 생깁니다.
예를 들어서 회원 정보에 학번, 이름, 전화번호는 연관된 자료형이지만 선언이 다르게 됩니다.
학번은 int, 이름은 char[], 전화번호는 string으로 선언될 수 있습니다.
그래서 이러한 연관된 자료를 묶을 필요가 생겼습니다. 연관된 자료를 묶는 것을 구조체라고 합니다.
이렇게 사용자 입장에서 새로운 자료형을 만드는 것을 사용자 정의 자료형이라고 합니다.
구조체 또한 int같은 자료형처럼 반환 값을 갖을 수 있게 됩니다.

 

 

#include <stdio.h>
typedef struct USERDATA {
	int nAge;
	char szName[32];
	char szPhone[32];
}USERDATA;

USERDATA GetUserData(void) {
	USERDATA user = { 0 };
	//%*c는 '\n'을 제거하기 위한 것이다.
	scanf("%d%*c", &user.nAge);
	gets_s(user.szName, sizeof(user.szName));
	gets_s(user.szPhone, sizeof(user.szPhone));
	return user;	
}

int main(void)
{
	USERDATA user = { 0 };
	user = GetUserData();
	return 0;
}


참고로 구조체에서는 call by value로 처리하면 스택을 많이 사용하므로
구조체의 값을 변경할 때는 함수의 인자로 전달하는 call by reference방식을 쓰는 것이 더 좋습니다.

사용자의 입장에서 편리하게 관리하기 위해서

상수 -> 변수(상수 이름붙임) -> 배열(같은 자료형 묶음) -> 구조체(연관된 자료형 묶음)

으로 발전하게 되었습니다.