"상수 (프로그래밍)"의 두 판 사이의 차이
(→참고자료) |
잔글 (→같이 보기) |
||
(사용자 2명의 중간 판 10개는 보이지 않습니다) | |||
1번째 줄: | 1번째 줄: | ||
'''상수'''(constant)는 [[프로그래밍 언어]]에서 프로그램이 실행되는 동안 '값이 고정되어 변경할 수 없는 메모리 공간'을 의미한다. | '''상수'''(constant)는 [[프로그래밍 언어]]에서 프로그램이 실행되는 동안 '값이 고정되어 변경할 수 없는 메모리 공간'을 의미한다. | ||
− | = 개요 = | + | == 개요 == |
상수(constant)란 변수와 마찬가지로 데이터를 저장할 수 있는 메모리 공간을 의미한다. | 상수(constant)란 변수와 마찬가지로 데이터를 저장할 수 있는 메모리 공간을 의미한다. | ||
하지만 상수가 변수와 다른 점은 프로그램이 실행되는 동안 상수에 저장된 데이터는 변경할 수 없다는 점이다. | 하지만 상수가 변수와 다른 점은 프로그램이 실행되는 동안 상수에 저장된 데이터는 변경할 수 없다는 점이다. | ||
이러한 상수는 표현 방식에 따라 리터럴 상수(literal constant), 심볼릭 상수(symbolic constant)로 나눌 수 있다.<ref name='const_synopsis'>TCPSchool, 〈[http://tcpschool.com/c/c_datatype_constant 상수 ]〉</ref> | 이러한 상수는 표현 방식에 따라 리터럴 상수(literal constant), 심볼릭 상수(symbolic constant)로 나눌 수 있다.<ref name='const_synopsis'>TCPSchool, 〈[http://tcpschool.com/c/c_datatype_constant 상수 ]〉</ref> | ||
− | = 상수의 종류 = | + | == 상수의 종류 == |
− | == 리터럴 상수 == | + | === 리터럴 상수 === |
− | * '''리터럴 상수(literal constant)''' : 리터럴 상수는 변수와는 달리 데이터가 저장된 메모리 공간을 가리키는 이름을 가지고 있지 않는다. | + | * '''리터럴 상수(literal constant)''' : 이름이 따로 정의되지 않은 상수를 말한다. 리터럴 상수는 변수와는 달리 데이터가 저장된 메모리 공간을 가리키는 이름을 가지고 있지 않는다. |
C 언어에서는 적절한 메모리 공간을 할당받기 위하여, 기본적으로 변수든 상수든 타입을 가지게 된다.<br> | C 언어에서는 적절한 메모리 공간을 할당받기 위하여, 기본적으로 변수든 상수든 타입을 가지게 된다.<br> | ||
리터럴 상수는 타입에 따라 '''정수형 리터럴 상수''', '''실수형 리터럴 상수''' 등으로 구분할 수 있다.<br><ref name='const_synopsis'></ref> | 리터럴 상수는 타입에 따라 '''정수형 리터럴 상수''', '''실수형 리터럴 상수''' 등으로 구분할 수 있다.<br><ref name='const_synopsis'></ref> | ||
− | === 정수형 리터럴 상수 === | + | ==== 정수형 리터럴 상수 ==== |
정수형 리터럴 상수는 123, -456과 같이 아라비아 숫자와 부호로 직접 표현된다.<br> | 정수형 리터럴 상수는 123, -456과 같이 아라비아 숫자와 부호로 직접 표현된다.<br> | ||
C++에서는 정수형 상수를 10진수뿐만 아니라 8진수(0으로 시작)나 16진수(0x로 시작)로도 표현할 수 있다.<br> | C++에서는 정수형 상수를 10진수뿐만 아니라 8진수(0으로 시작)나 16진수(0x로 시작)로도 표현할 수 있다.<br> | ||
이렇게 여러 가지 진법으로 표현된 정수형 상수의 출력을 위해 cout 객체는 dec, hex, oct 조정자를 제공하고 있다.<br> | 이렇게 여러 가지 진법으로 표현된 정수형 상수의 출력을 위해 cout 객체는 dec, hex, oct 조정자를 제공하고 있다.<br> | ||
이 세 가지 조정자를 cout 객체에 전달하면 사용자가 다시 변경하기 전까지 출력되는 진법의 형태를 계속 유지할 수 있다.<br> | 이 세 가지 조정자를 cout 객체에 전달하면 사용자가 다시 변경하기 전까지 출력되는 진법의 형태를 계속 유지할 수 있다.<br> | ||
− | ==== 정수형 리터럴 상수의 타입 ==== | + | ===== 정수형 리터럴 상수의 타입 ===== |
C++에서 정수형 리터럴 상수는 다음과 같은 경우를 제외하면 모두 int형으로 저장된다.<br> | C++에서 정수형 리터럴 상수는 다음과 같은 경우를 제외하면 모두 int형으로 저장된다.<br> | ||
1. 데이터의 값이 너무 커서 int형으로 저장할 수 없는 경우<br> | 1. 데이터의 값이 너무 커서 int형으로 저장할 수 없는 경우<br> | ||
42번째 줄: | 42번째 줄: | ||
|align=center|unsigned long long형 (C++11부터 제공) | |align=center|unsigned long long형 (C++11부터 제공) | ||
|} <ref name='const_synopsis2'></ref> | |} <ref name='const_synopsis2'></ref> | ||
− | === 실수형 리터럴 상수 === | + | |
+ | ==== 실수형 리터럴 상수 ==== | ||
C++에서 실수형 리터럴 상수는 모두 부동 소수점 방식으로 저장된다.<br> | C++에서 실수형 리터럴 상수는 모두 부동 소수점 방식으로 저장된다.<br> | ||
이러한 실수형 리터럴 상수는 모두 double형으로 저장되며, 접미사를 추가하여 저장되는 타입을 직접 명시할 수도 있다. | 이러한 실수형 리터럴 상수는 모두 double형으로 저장되며, 접미사를 추가하여 저장되는 타입을 직접 명시할 수도 있다. | ||
− | ==== 실수형 리터럴 상수의 타입 ==== | + | ===== 실수형 리터럴 상수의 타입 ===== |
다음 표는 C++에서 접미사를 추가하여 나타낼 수 있는 실수형 타입을 나타낸다.<br> | 다음 표는 C++에서 접미사를 추가하여 나타낼 수 있는 실수형 타입을 나타낸다.<br> | ||
:{|class=wikitable width=700 style="background-color:white" | :{|class=wikitable width=700 style="background-color:white" | ||
61번째 줄: | 62번째 줄: | ||
|align=center|long double형 | |align=center|long double형 | ||
|} <ref name='const_synopsis2'></ref> | |} <ref name='const_synopsis2'></ref> | ||
− | === 포인터 리터럴 상수 === | + | |
+ | ==== 포인터 리터럴 상수 ==== | ||
널 포인터(null pointer)란 아무것도 가리키고 있지 않은 포인터를 의미하는데, 지금까지 C++에서는 널 포인터를 표현하기 위해서 포인터를 0으로 초기화해 왔다. | 널 포인터(null pointer)란 아무것도 가리키고 있지 않은 포인터를 의미하는데, 지금까지 C++에서는 널 포인터를 표현하기 위해서 포인터를 0으로 초기화해 왔다. | ||
하지만 C++11부터는 nullptr 키워드를 제공함으로써 0으로 초기화된 널 포인터보다 더욱 제대로 널 포인터를 표현할 수 있게 되었다. | 하지만 C++11부터는 nullptr 키워드를 제공함으로써 0으로 초기화된 널 포인터보다 더욱 제대로 널 포인터를 표현할 수 있게 되었다. | ||
68번째 줄: | 70번째 줄: | ||
하지만 nullptr 리터럴 상수를 사용하는 것이 좀 더 안전한 프로그램을 만들 수 있다.<ref name='const_synopsis2'></ref> | 하지만 nullptr 리터럴 상수를 사용하는 것이 좀 더 안전한 프로그램을 만들 수 있다.<ref name='const_synopsis2'></ref> | ||
− | == 심볼릭 상수 == | + | === 심볼릭 상수 === |
* '''심볼릭 상수(symbolic constant)''' : 심볼릭 상수는 변수와 마찬가지로 이름을 가지고 있는 상수이다. | * '''심볼릭 상수(symbolic constant)''' : 심볼릭 상수는 변수와 마찬가지로 이름을 가지고 있는 상수이다. | ||
이러한 심볼릭 상수는 반드시 선언과 동시에 초기화되어야 한다. | 이러한 심볼릭 상수는 반드시 선언과 동시에 초기화되어야 한다. | ||
82번째 줄: | 84번째 줄: | ||
3. 해당 심볼릭 상수를 특정 함수나 파일에서만 사용할 수 있도록 제한할 수 있다.<br><ref name='const_synopsis2'></ref> | 3. 해당 심볼릭 상수를 특정 함수나 파일에서만 사용할 수 있도록 제한할 수 있다.<br><ref name='const_synopsis2'></ref> | ||
− | = 자바 언어에서의 상수 활용 = | + | == C 언어에서 상수 정의 == |
− | == static final == | + | === define 전처리기를 사용하는 방법 === |
− | 자바 프로그래밍에서 상수 선언을 할 때 원래 [[ | + | #define identifier value |
+ | |||
+ | define으로 전처리기 지시자를 통해 상수를 정의할 수 있다.<br> | ||
+ | 이렇게 정의된 상수는 전처리 단계에서 value로 치환된 이후 컴파일된다.<br><ref name='const_ex'>Peter, 〈[https://gracefulprograming.tistory.com/43 자바의 final 상수 ]〉, 2017년 1월 26일</ref> | ||
+ | |||
+ | #include <stdio.h> | ||
+ | #define LENGTH 10 | ||
+ | #define WIDTH 5 | ||
+ | #define NEWLINE '\n' | ||
+ | |||
+ | int main() { | ||
+ | int area; | ||
+ | |||
+ | area = LENGTH * WIDTH; | ||
+ | printf("value of area : %d", area); | ||
+ | printf("%c", NEWLINE); | ||
+ | |||
+ | return 0; | ||
+ | |||
+ | }<ref name='const_ex'></ref> | ||
+ | |||
+ | === const 키워드를 사용하는 방법 === | ||
+ | const 키워드를 통해 변수를 선언할 때 상수로 지정할 수 있다.<br><ref name='const_ex'></ref> | ||
+ | |||
+ | const type variable = value; | ||
+ | |||
+ | 이렇게 선언된 변수는 값을 변경할 수 없다<br> | ||
+ | 실제로 참조할 때는 define을 사용할 때와 차이가 없다.<br> | ||
+ | |||
+ | #include <stdio.h> | ||
+ | |||
+ | int main() { | ||
+ | const int LENGTH = 10; | ||
+ | const int WIDTH = 5; | ||
+ | const char NEWLINE = '\n'; | ||
+ | int area; area = LENGTH * WIDTH; | ||
+ | |||
+ | printf("value of area : %d", area); | ||
+ | printf("%c", NEWLINE); | ||
+ | return 0; | ||
+ | }<ref name='const_ex'></ref> | ||
+ | |||
+ | == 자바 언어에서의 상수 활용 == | ||
+ | === static final === | ||
+ | 자바 프로그래밍에서 상수 선언을 할 때 원래 final([[파이널]])이 사용된다.<br> | ||
하지만 관례상 final이 아닌 static final로 선언하는데, 이 경우 static final 변수는 클래스가 로딩되어있는 동안 그 상수 값을 변경할 수 없다.<br> | 하지만 관례상 final이 아닌 static final로 선언하는데, 이 경우 static final 변수는 클래스가 로딩되어있는 동안 그 상수 값을 변경할 수 없다.<br> | ||
자바로 프로젝트를 진행할때 여러 파일에서 공유해야하는 final 변수는 public static final로 선언하여 사용하면 좋다.<ref name='java_ex'>나다움, 〈[https://life-with-coding.tistory.com/274 자바의 final 상수 ]〉, 2020년 3월 29일</ref> | 자바로 프로젝트를 진행할때 여러 파일에서 공유해야하는 final 변수는 public static final로 선언하여 사용하면 좋다.<ref name='java_ex'>나다움, 〈[https://life-with-coding.tistory.com/274 자바의 final 상수 ]〉, 2020년 3월 29일</ref> | ||
− | === 예시 === | + | |
+ | ==== 예시 ==== | ||
public class DefineMath { | public class DefineMath { | ||
95번째 줄: | 142번째 줄: | ||
}<ref name='java_ex'></ref> | }<ref name='java_ex'></ref> | ||
− | |||
− | |||
{{각주}} | {{각주}} | ||
== 참고자료 == | == 참고자료 == | ||
− | * TCPSchool, 〈[http://tcpschool.com/c/c_datatype_constant 상수 ]〉 | + | * TCPSchool, 〈[http://tcpschool.com/c/c_datatype_constant 상수 ]〉 |
− | * TCPSchool, 〈[http://tcpschool.com/cpp/cpp_datatype_constant 상수 ]〉 | + | * TCPSchool, 〈[http://tcpschool.com/cpp/cpp_datatype_constant 상수 ]〉 |
− | * 나다움, 〈[https://life-with-coding.tistory.com/274 자바의 final 상수 ]〉, 2020년 3월 29일 | + | * 나다움, 〈[https://life-with-coding.tistory.com/274 자바의 final 상수 ]〉, 2020년 3월 29일 |
== 같이 보기 == | == 같이 보기 == | ||
+ | * [[상수]] | ||
+ | * [[프로그래밍]] | ||
+ | * [[객체지향 프로그래밍]] | ||
* [[C언어]] | * [[C언어]] | ||
+ | * [[자바]] | ||
+ | * [[변수]] | ||
+ | * [[기본형변수]] | ||
{{프로그래밍|검토 필요}} | {{프로그래밍|검토 필요}} |
2022년 11월 11일 (금) 23:06 기준 최신판
상수(constant)는 프로그래밍 언어에서 프로그램이 실행되는 동안 '값이 고정되어 변경할 수 없는 메모리 공간'을 의미한다.
목차
개요[편집]
상수(constant)란 변수와 마찬가지로 데이터를 저장할 수 있는 메모리 공간을 의미한다. 하지만 상수가 변수와 다른 점은 프로그램이 실행되는 동안 상수에 저장된 데이터는 변경할 수 없다는 점이다. 이러한 상수는 표현 방식에 따라 리터럴 상수(literal constant), 심볼릭 상수(symbolic constant)로 나눌 수 있다.[1]
상수의 종류[편집]
리터럴 상수[편집]
- 리터럴 상수(literal constant) : 이름이 따로 정의되지 않은 상수를 말한다. 리터럴 상수는 변수와는 달리 데이터가 저장된 메모리 공간을 가리키는 이름을 가지고 있지 않는다.
C 언어에서는 적절한 메모리 공간을 할당받기 위하여, 기본적으로 변수든 상수든 타입을 가지게 된다.
리터럴 상수는 타입에 따라 정수형 리터럴 상수, 실수형 리터럴 상수 등으로 구분할 수 있다.
[1]
정수형 리터럴 상수[편집]
정수형 리터럴 상수는 123, -456과 같이 아라비아 숫자와 부호로 직접 표현된다.
C++에서는 정수형 상수를 10진수뿐만 아니라 8진수(0으로 시작)나 16진수(0x로 시작)로도 표현할 수 있다.
이렇게 여러 가지 진법으로 표현된 정수형 상수의 출력을 위해 cout 객체는 dec, hex, oct 조정자를 제공하고 있다.
이 세 가지 조정자를 cout 객체에 전달하면 사용자가 다시 변경하기 전까지 출력되는 진법의 형태를 계속 유지할 수 있다.
정수형 리터럴 상수의 타입[편집]
C++에서 정수형 리터럴 상수는 다음과 같은 경우를 제외하면 모두 int형으로 저장된다.
1. 데이터의 값이 너무 커서 int형으로 저장할 수 없는 경우
2. 정수형 상수에 접미사를 사용하여, 해당 상수의 타입을 직접 명시하는 경우
C++에서는 접미사를 상수의 끝에 추가하여, 해당 상수의 타입을 직접 명시할 수 있다.
다음 표는 C++에서 접미사를 추가하여 나타낼 수 있는 정수형 타입을 나타낸다.
[2]
접미사 타입 기본 설정 (signed) int형 u 또는 U unsigned int형 l 또는 L (signed) long형 ul 또는 uL 또는 Ul 또는 UL unsigned long형 long long 또는 u11 또는 U11 또는 uLL 또는 ULL unsigned long long형 (C++11부터 제공)
실수형 리터럴 상수[편집]
C++에서 실수형 리터럴 상수는 모두 부동 소수점 방식으로 저장된다.
이러한 실수형 리터럴 상수는 모두 double형으로 저장되며, 접미사를 추가하여 저장되는 타입을 직접 명시할 수도 있다.
실수형 리터럴 상수의 타입[편집]
다음 표는 C++에서 접미사를 추가하여 나타낼 수 있는 실수형 타입을 나타낸다.
접미사 타입 f 또는 F float형 기본 설정 double형 l 또는 L long double형
포인터 리터럴 상수[편집]
널 포인터(null pointer)란 아무것도 가리키고 있지 않은 포인터를 의미하는데, 지금까지 C++에서는 널 포인터를 표현하기 위해서 포인터를 0으로 초기화해 왔다. 하지만 C++11부터는 nullptr 키워드를 제공함으로써 0으로 초기화된 널 포인터보다 더욱 제대로 널 포인터를 표현할 수 있게 되었다. nullptr 키워드를 사용한 리터럴 상수의 타입은 포인터 타입이며, 정수형으로 변환할 수 없다. 아직도 C++에서는 0을 사용해 널 포인터를 명시할 수 있으며, 따라서 nullptr == 0은 참(true)을 반환한다. 하지만 nullptr 리터럴 상수를 사용하는 것이 좀 더 안전한 프로그램을 만들 수 있다.[2]
심볼릭 상수[편집]
- 심볼릭 상수(symbolic constant) : 심볼릭 상수는 변수와 마찬가지로 이름을 가지고 있는 상수이다.
이러한 심볼릭 상수는 반드시 선언과 동시에 초기화되어야 한다.
하지만 매크로를 이용한 선언은 C언어의 문법이므로, C++에서는 가급적 const 키워드를 사용하여 선언하도록 한다.
[2]
C++에서 심볼릭 상수를 만드는 일반적인 방식은 다음과 같다.
const int ages = 30;
위의 예제처럼 const 키워드를 사용한 상수는 선언과 함께 반드시 초기화해야 한다.
매크로를 이용한 선언보다 const 키워드를 사용한 심볼릭 상수의 장점은 다음과 같다.
1. 상수의 타입을 명시적으로 지정할 수 있다.
2. 구조체와 같은 복잡한 사용자 정의 타입에도 사용할 수 있다.
3. 해당 심볼릭 상수를 특정 함수나 파일에서만 사용할 수 있도록 제한할 수 있다.
[2]
C 언어에서 상수 정의[편집]
define 전처리기를 사용하는 방법[편집]
#define identifier value
define으로 전처리기 지시자를 통해 상수를 정의할 수 있다.
이렇게 정의된 상수는 전처리 단계에서 value로 치환된 이후 컴파일된다.
[3]
#include <stdio.h> #define LENGTH 10 #define WIDTH 5 #define NEWLINE '\n' int main() { int area; area = LENGTH * WIDTH; printf("value of area : %d", area); printf("%c", NEWLINE); return 0; }[3]
const 키워드를 사용하는 방법[편집]
const 키워드를 통해 변수를 선언할 때 상수로 지정할 수 있다.
[3]
const type variable = value;
이렇게 선언된 변수는 값을 변경할 수 없다
실제로 참조할 때는 define을 사용할 때와 차이가 없다.
#include <stdio.h> int main() { const int LENGTH = 10; const int WIDTH = 5; const char NEWLINE = '\n'; int area; area = LENGTH * WIDTH; printf("value of area : %d", area); printf("%c", NEWLINE); return 0; }[3]
자바 언어에서의 상수 활용[편집]
static final[편집]
자바 프로그래밍에서 상수 선언을 할 때 원래 final(파이널)이 사용된다.
하지만 관례상 final이 아닌 static final로 선언하는데, 이 경우 static final 변수는 클래스가 로딩되어있는 동안 그 상수 값을 변경할 수 없다.
자바로 프로젝트를 진행할때 여러 파일에서 공유해야하는 final 변수는 public static final로 선언하여 사용하면 좋다.[4]
예시[편집]
public class DefineMath { public static final int MIN_NUM = 1; public static final int MAX_NUM = 9999; public static final double PI = 3.141592; }[4]
각주[편집]
참고자료[편집]
- TCPSchool, 〈상수 〉
- TCPSchool, 〈상수 〉
- 나다움, 〈자바의 final 상수 〉, 2020년 3월 29일
같이 보기[편집]