목차
- 리터럴(literal)
1-1. 리터럴이란?
1-2. 리터럴 출력
1-3. 리터럴 연산 - 변수(variable)
2-1. 변수 사용 목적
2-2. 자료형(Type)
1. 리터럴(literal)
1-1. 리터럴이란?
- 리터럴이란 123, 3.14, 'A'와 같은 값 그 자체를 칭한다.
종류 | 예 |
숫자(정수) | 1, 123, 365 |
숫자(실수) | 3.14 |
문자 | 'a', 'A' |
문자열 | "안녕하세요" |
논리 | true, false |
▲ 표1-1. 리터럴의 종류와 예
- 리터럴의 종류로는 숫자(정수와 실수), 문자, 문자열, 논리가 있으며, 그 종류에 따라 사용할 수 있는 연산자가 다르다. 정수와 정수간 합을 구하는 식 (1+23)에서는 24라는 정수 값이 얻어지지만, 문자열을 표현한 식 ("1" + "23")은 "123"이라는 문자열이 출력된다. 리터럴 출력에 대해서는 아래서 자세히 기술하겠다.
✅ 리터럴의 정의와 종류를 설명할 수 있다.
1-2. 리터럴 출력
1-2-1. 정수 형태의 값 출력
System.out.println(123);
실행결과 : 123
1-2-2. 실수 형태의 값 출력
System.out.println(3.14);
실행결과 : 3.14
1-2-3. 문자 형태의 값 출력
- 작은따옴표(single-quotation)로 문자 하나를 감싼 것을 문자 리터럴이라고 한다: 'a', 'A' 등
System.out.println('a');
실행결과 : a
- 문자 형태의 값이 반드시 하나 요구되는 특성상 필요 시에는 작은따옴표 사이에 공백(blank) 문자를 넣어 초기화할 수 있다.
System.out.println(' ');
실행결과:
*공백이 보여지고 있다.
- 하나의 문자만 저장할 수 있기 때문에 아래의 예시처럼 작은따옴표 안에 문자가 없는 경우, 두 개 이상의 문자가 들어있는 경우에는 오류가 발생한다. 빈 문자를 출력하고 싶다면 바로 위의 예시처럼 공백('_')을 추가해야 한다.
System.out.println('');
System.out.println('ab');
실행결과 : 오류
오류 메시지 : Invalid character constant
- 그 값이 숫자라 할지라도 양옆에 작은따옴표를 붙이면 문자로 판단된다. 아래 예시의 실행결과 '1'이 우리 눈엔 여전히 숫자로 보일지 모르나, 컴퓨터는 이를 문자 '1'로 읽고 있다.
System.out.println('1');
실행결과 : 1
1-2-4. 문자열 형태의 값 출력
- 문자열은 문자의 연속된 나열을 뜻한다. 즉 두 문자 이상을 가지고 있는 것이다.
- 문자열 형태의 값은 큰따옴표(double-quotation)로 감싸주어야 한다: "Hello", "Java" 등
- 한 개의 문자를 큰따옴표로 감쌌대도 그 값은 문자가 아닌 문자열이다. 문자열 "a"와 문자 'a'는 엄연히 다른 값이다.
System.out.println("안녕하세요");
System.out.println("a");
실행결과 : 안녕하세요
실행결과 : a
- 빈 문자열을 출력하려거든 안에 아무런 문자 없이 큰따옴표만 넣어주면 된다.
System.out.println("");
실행결과 :
*공백이 보여지고 있다.
- 실행결과 값은 숫자 정수가 아닌 문자열 "123"이다.
System.out.println("123");
실행결과 : 123
1-2-5. 논리 형태의 값 출력
- true 혹은 false 중 하나를 값으로 가진다. 조건식과 논리적 계산에 사용된다.
System.out.println(true);
System.out.println(false);
실행결과 : true
실행결과 : false
✅ 리터럴 종류마다 출력에 필요한 규칙을 설명할 수 있다.
✅ 리터럴을 다룬 출력메소드를 보고 그것의 실행결과를 예상할 수 있다.
1-3. 리터럴 연산
❗ 나머지 연산자 모듈러(Modulo, mod, %) : 왼쪽 피연산자를 오른쪽 피연산자로 나누었을 때의 나머지를 구한다.
System.out.println(5 / 2); // 몫 System.out.println(5 % 2); // 나머지
주어진 식이 위와 같은 경우 몫은 2, 나머지는 1이 된다.
1-3-숫자A. 정수와 정수의 연산
- 산술연산자 +, -, *, /, % 사용 가능하다.
- (123 / 10)을 출력하면 12.3이 아닌 12가 나온다. 이는 정수간 나누기 연산이기 때문에 소숫점자리가 탈락된 것이다.
System.out.println(123 + 45);
System.out.println(123 - 23);
System.out.println(123 * 10);
System.out.println(123 / 10); // 12
System.out.println(123 % 10);
실행결과 : 168
실행결과 : 100
실행결과 : 1230
실행결과 : 12
실행결과 : 3
1-3-숫자B. 실수와 실수의 연산
- 산술연산자 +, -, *, /, % 사용 가능하다.
- (1.23 % 1.0)에서 그 값이 0.23으로 떨어지지 않고 약간의 오차가 발생한 것을 볼 수 있다. 이는 컴퓨터가 실수 값을 저장하는 방식 때문이다.
System.out.println(1.23 + 1.23);
System.out.println(1.23 - 0.23);
System.out.println(1.23 * 10.0);
System.out.println(1.23 / 10.0);
System.out.println(1.23 % 1.0); // 0.22999999999999998
실행결과 : 2.46
실행결과 : 1.0
실행결과 : 12.3
실행결과 : 0.123
실행결과 : 0.22999999999999998
1-3-숫자C. 정수와 실수의 연산
- 산술연산자 +, -, *, /, % 사용 가능하다.
- 항상 실수 값이 나온다.
System.out.println(123 + 0.5);
System.out.println(123 - 0.5);
System.out.println(123 * 0.5);
System.out.println(123 / 0.5);
System.out.println(123 % 0.5);
실행결과 : 123.5
실행결과 : 122.5
실행결과 : 61.5
실행결과 : 246.0
실행결과 : 0.0
1-3-문자A. 문자와 문자의 연산
- 산술연산자 +, -, *, /, % 사용 가능하다.
- ('a' % 'b')의 결과로 나머지 값이 97이라는 건 'a'가 97이라는 것을 의미한다. 컴퓨터는 문자 'a'=97로 보고 있다.
- 컴퓨터의 언어는 0과 1이라는 숫자뿐이다. 그렇기 때문에 그밖의 숫자, 문자, 기호들을 숫자 표현으로 정한 아스키 코드표(ASCII Table) 등이 존재한다. 컴퓨터는 이를 통해 우리가 입력한 값들을 인식 및 처리하고 있는 것이다.
System.out.println('a' + 'b');
System.out.println('a' - 'b');
System.out.println('a' * 'b');
System.out.println('a' / 'b');
System.out.println('a' % 'b');
실행결과 : 195
실행결과 : -1
실행결과 : 9506
실행결과 : 0
실행결과 : 97
1-3-문자B. 문자와 정수의 연산
- 산술연산자 +, -, *, /, % 사용 가능하다.
- 결과를 통해 문자 'a'를 나타내는 값이 97임을 유추할 수 있다.
System.out.println('a' + 1);
System.out.println('a' - 1);
System.out.println('a' * 2);
System.out.println('a' / 2);
System.out.println('a' % 2);
실행결과 : 98
실행결과 : 96
실행결과 : 194
실행결과 : 48
실행결과 : 1
1-3-문자C. 문자와 실수의 연산
- 산술연산자 +, -, *, /, % 사용 가능하다.
- 여기서 결과는 실수 형태로 나오게 된다.
System.out.println('a' + 1.0);
System.out.println('a' - 1.0);
System.out.println('a' * 2.0);
System.out.println('a' / 2.0);
System.out.println('a' % 2.0);
실행결과 : 98.0
실행결과 : 96.0
실행결과 : 194.0
실행결과 : 48.5
실행결과 : 1.0
1-3-문자열A. 문자열과 문자열의 연산
- 산술연산자 +만 사용 가능하다.
System.out.println("abc" + "xyz");
// System.out.println("abc" - "xyz");
// System.out.println("abc" * "xyz");
// System.out.println("abc" / "xyz");
// System.out.println("abc" % "xyz");
실행결과 : abcxyz
1-3-문자열B. 문자열과 다른 형태의 값 연산
- 피연산자 중 문자열이 있다면, 문자열로 변환 및 결합 과정이 발생한다.
System.out.println("abc" + 123);
System.out.println("abc" + 123.45);
System.out.println("abc" + 'd');
System.out.println("abc" + true);
System.out.println(true + "abc");
System.out.println("123" + "456");
실행결과 : abc123
실행결과 : abc123.45
실행결과 : abcd
실행결과 : abctrue
실행결과 : trueabc
실행결과 : 123456
1-3-문자열C. 문자열 순서에 따른 연산
- 문자열 나열 순서에 따라 산출되는 값이 달라진다. 문자열과의 결합이 일어나지 않도록 구하고자 하는 식에 괄호()를 붙여줌으로써 보다 확실한 결과를 유도할 수 있다.
❗ 사칙연산 우선순위에 맞춰 +, -보다 *, /, %가 먼저 계산된다. 하지만 변환 및 결합이라는 특성을 지닌 문자열을 사용할 때는 가급적 계산하고자 하는 식을 괄호()로 묶어 구분하는 것이 좋다.
- ("50 - 60 = " + 50 - 60)은 문법적으로 잘못된 컴파일 에러의 예이다. 문자열은 마이너스(-) 연산이 불가하다.
System.out.println("50 + 60 = " + 50 + 60);
System.out.println("50 + 60 = " + (50 + 60));
// System.out.println("50 - 60 = " + 50 - 60);
System.out.println("50 - 60 = " + (50 - 60));
System.out.println("50 * 60 = " + 50 * 60);
System.out.println("50 * 60 = " + (50 * 60));
실행결과 : 50 + 60 = 5060
실행결과 : 50 + 60 = 110
실행결과 : 50 - 60 = -10
실행결과 : 50 * 60 = 3000
실행결과 : 50 * 60 = 3000
✅ 리터럴간 연산에서 가지는 특징과 규칙을 설명할 수 있다.
✅ 문자열과 사칙연산을 활용해 해당 코드를 설명하는 내용과 값을 하나의 문장으로 출력할 수 있다.
2. 변수(variable)
2-1. 변수 사용 목적
- 변수는 메모리에 하나의 데이터를 기록하기 위한 공간을 일컫는다.
- 코드란 작업자 혼자 사용하기보다는 협업에 기반한 것이므로 가급적 재사용성과 유지보수성을 높여야 한다. 이같은 코드 사용 시 지향점과 변수 사용 목적이 곧잘 맞닿아있다.
2-1-1. 변수를 사용해 코드 의미 파악을 돕는다.
- 산출된 숫자만 가지고는 값이 가진 의미를 파악하기 어렵다. 온오프라인 총매출액을 기록한 아래 예시처럼 실행결과로 온오프라인 총매출액 : 15000000원이 나왔으나 그 중 온라인 매출액이 얼마였고, 오프라인 매출액은 얼마였는지, 어떻게 더해져서 이 결과값이 나왔는지 코드만 놓고는 전혀 알아볼 수 없는 것이다. 변수를 사용해 이러한 불편을 줄일 수 있다.
/* 변수를 적용하지 않은 예시 */
System.out.println("온오프라인 총매출액 : " + (10_000_000 + 5_000_000) + "원");
실행결과 : 온오프라인 총매출액 : 15000000원
이번엔 변수를 사용하여 온라인 매출액과 오프라인 매출액을 구분했다. 결과값은 물론 위와 동일하지만, 온오프라인 매출액이 각각 얼마였는지 파악할 수 있게 된 것이다.
int online = 10000000;
int offline = 5000000;
System.out.println("온오프라인 총매출액 : " + (online + offline) + "원");
실행결과 : 온오프라인 총매출액 : 15000000원
2-1-2. 변수를 사용해 재사용성을 높인다.
- 아래는 변수를 적용하지 않은 예시이다. 고객 전원에게 같은 인사말을 반복 사용한 모습이다. 문구 수정이 필요하게 되거든 첫 줄부터 마지막 줄까지 일일이 변경해야 하는 번거로움이 따른다.
/* 변수를 적용하지 않은 예시 */
System.out.println("A고객님, 2022년에도 새해 복 많이 받으세요!");
System.out.println("B고객님, 2022년에도 새해 복 많이 받으세요!");
System.out.println("C고객님, 2022년에도 새해 복 많이 받으세요!");
System.out.println("D고객님, 2022년에도 새해 복 많이 받으세요!");
System.out.println("E고객님, 2022년에도 새해 복 많이 받으세요!");
실행결과 : A고객님, 2022년에도 새해 복 많이 받으세요!
실행결과 : B고객님, 2022년에도 새해 복 많이 받으세요!
실행결과 : C고객님, 2022년에도 새해 복 많이 받으세요!
실행결과 : D고객님, 2022년에도 새해 복 많이 받으세요!
실행결과 : E고객님, 2022년에도 새해 복 많이 받으세요!
- 변수를 사용하여 반복되는 값을 대체하고 코드를 개선할 수 있다.
int year = 2022;
System.out.println("A고객님, " + year + "년에도 새해 복 많이 받으세요!");
System.out.println("B고객님, " + year + "년에도 새해 복 많이 받으세요!");
System.out.println("C고객님, " + year + "년에도 새해 복 많이 받으세요!");
System.out.println("D고객님, " + year + "년에도 새해 복 많이 받으세요!");
System.out.println("E고객님, " + year + "년에도 새해 복 많이 받으세요!");
실행결과 : A고객님, 2022년에도 새해 복 많이 받으세요!
실행결과 : B고객님, 2022년에도 새해 복 많이 받으세요!
실행결과 : C고객님, 2022년에도 새해 복 많이 받으세요!
실행결과 : D고객님, 2022년에도 새해 복 많이 받으세요!
실행결과 : E고객님, 2022년에도 새해 복 많이 받으세요!
2-1-3. 변수를 사용해 유지보수성을 높인다.
- 시간에 따라 혹은 사용에 따라 초기값 변경이 필요하게 마련이다. 이처럼 변수는 값을 수정, 저장해 사용할 수 있다.
- 단, 하나의 값만을 취급하므로 가장 마지막에 저장된 값이 변수의 값이 되는 것이다.
int meteor = 6;
System.out.println("지난 1분 동안 " + meteor + "개의 유성우가 관측되었습니다.");
meteor = meteor + 12;
System.out.println("지난 10분 동안 " + meteor + "개의 유성우가 관측되었습니다.");
실행결과 : 지난 1분 동안 6개의 유성우가 관측되었습니다.
실행결과 : 지난 10분 동안 18개의 유성우가 관측되었습니다.
✅ 변수 선언 및 초기화하여 사용할 수 있다.
✅ 변수를 사용하는 목적에 대해 설명할 수 있다.
2-2. 자료형(Type)
❗ 변수 선언은 다음과 같은 형태로 작성된다 : 자료형 변수명;
int num;
❗ 변수 사용은 지역변수 선언 → 초기화 → 호출 단계로 이뤄진다.
/* 1. 변수 선언 */ int num; // System.out.println(num); // 초기화 전 호출이므로 에러. /* 2. 변수 초기화 */ num = 100; /* 3. 변수 호출 */ System.out.println(num);
❗ 대입연산자(=)는 오른쪽에서 왼쪽으로 실행된다. 오른쪽에 있는 리터럴 값을 왼쪽에 있는 변수에 저장하는 것이다.
- 대입연산자를 기준으로 왼편과 오른편이 같은 타입의 값이어야 한다. 때문에 데이터의 크기와 형태에 알맞게 자료형을 선택해야 한다.
- 1 byte부터 8 byte에 이르기까지 공간이 늘어나면 표현할 수 있는 값의 범위가 늘어난다는 뜻이다.
종류/크기 | 1 byte | 2 byte | 4 byte | 8 byte |
논리형 | boolean | |||
문자형 | char | |||
정수형 | byte | short | int | long |
실수형 | float | double |
▲ 표2-1. 자료형의 종류와 크기
- 기본 자료형(Primitive type) 8가지이다: boolean, char, byte, short, int, long, float, double
- 논리형 표현식 boolean은 true(1) 혹은 false(0) 값만을 가질 수 있다. 이는 1 byte(8 bit)까지도 필요 없고 1 bit만 있어도 처리 가능한 값이지만, 연산을 위해 1 byte라는 최소 단위를 가진 것이다.
- 문자형 char는 character에서 따온 것이다. 'a', 'b', '2'와 같이 하나의 문자 값을 작은따옴표와 함께 표기한다. 크기는 2 byte로 16 bit에 해당한다.
- 정수형의 기준 자료형은 int이다. 그보다 작아서 short, 커서 long이라고 이름 붙여진 자료형들과 더불어 byte라는 최소 단위 역시 정수형에 속한다.
- 실수형에는 float와 double 두 종류가 있다. double이 상대적으로 유효 자리 숫자가 두 배, 즉 정확도가 높다. 실수형의 기준 자료형이 바로 double이다.
❗ 문자열 String : 기본 자료형에 해당하지 않는다. 이는 참조 자료형(Reference type)에 속한다. 기본 자료형과는 다르게 값을 저장하거나 하지 않고, 저장된 주소값을 가리키는(참조하는) 역할을 한다. 참조형 String 값은 별도 영역에 저장돼(예. 0x100) String은 그 위치를 참조한다.
자료형 | 예 |
boolean | true, false |
char | 'a', 'A', '0' |
byte | 100 |
short | 100 |
int | 100 |
long | 100L |
float | 3.14f |
double | 3.14 |
▲ 표2-2. 기본자료형 8가지와 예시
- long 타입이라고 표기하기 위해 100L에서처럼 L 붙여야 한다. 소문자 l은 작업 환경에 따라 자칫 숫자 1과 혼선이 있을 수 있어 대문자 사용이 권장된다.
- float 값 뒤에 숫자만 작성해서는 컴파일 에러가 뜬다. 3.14f와 같이 float 타입의 값이라고 명시하여야 한다. 대문자 F로 써도 문법적 오류는 없지만 소문자를 일반적으로 사용한다.
/* 기본자료형(Primitive type) 8가지는 다음과 같다. */
byte b = 1;
short s = 2;
int i = 4;
long l = 8L;
float f = 4.0f;
double d = 8.0;
char ch = 'a';
boolean power = true;
/* 문자열을 나타내는 참조자료형(Reference type) */
String str = "Hello";
System.out.println("b=" + b);
System.out.println("s=" + s);
System.out.println("i=" + i);
System.out.println("l=" + l);
System.out.println("f=" + f);
System.out.println("d=" + d);
System.out.println("ch=" + ch);
System.out.println("power=" + power);
System.out.println("str=" + str);
실행결과 : b=1
실행결과 : s=2
실행결과 : i=4
실행결과 : l=8
실행결과 : f=4.0
실행결과 : d=8.0
실행결과 : ch=a
실행결과 : power=true
실행결과 : str=Hello
✅ 데이터 크기에 알맞은 자료형을 선택해 사용할 수 있다.
✅ 기본 자료형 8가지 종류, 크기, 특징에 대해 설명할 수 있다.
✅ 기본 자료형과 참조 자료형 String의 차이를 설명할 수 있다.
'Java' 카테고리의 다른 글
[JAVA] 2. 연산자 (0) | 2021.12.21 |
---|---|
[JAVA] 1-2. 변수 명명 규칙, 상수, 오버플로우, 형변환 (0) | 2021.12.20 |
[자바의 정석] Ch 2. 변수 예제 응용 학습 (0) | 2021.12.19 |
[자바의 정석] Ch 2. 변수 연습문제 풀이 (0) | 2021.12.18 |
[JAVA] 0. 자바 언어 특징과 개발 환경 (0) | 2021.12.16 |