이것이 자바다 01 자바 시작하기 / 02 변수와 타입 확인문제 풀이
01 자바 시작하기
1. JDK와 JRE의 차이점을 설명한 것 중 틀린 것은 무엇입니까?
① JDK는 JRE와 컴파일러 등의 개발 도구가 포함된다.
② 자바 프로그램을 개발하려면 JDK가 반드시 필요하다.
③ 자바 프로그램을 실행만 하려면 JRE를 설치해도 상관없다.
④ JRE에는 컴파일러(javac.exe)가 포함되어 있다.
<정답>
④ JRE에는 컴파일러(javac.exe)가 포함되어 있다.
<문제풀이>
JDK에는 프로그램 개발에 필요한 자바 가상 기계(JVM), 라이브러리 API, 컴파일러 등의 개발도구가 포함되어 있지만 JRE에는 프로그램 실행에 필요한 자바 가상 기계(JVM), 라이브러리 API만 포함되어 있다. 이미 개발된 프로그램만 실행한다면 JRE만 설치하면 된다.
2. JVM에 대한 설명으로 틀린 것은 무엇입니까?
① JVM은 java.exe 명령어에 의해 구동된다.
② JVM은 바이트 코드를 기계어로 변환시키고 실행한다.
③ JVM은 운영체제에 독립적이다(운영체제별로 동일한 JVM이 사용된다).
④ 바이트 코드는 JVM에 독립적이지만, JVM은 운영체제에 종속적이다.
<정답>
③ JVM은 운영체제에 독립적이다(운영체제별로 동일한 JVM이 사용된다).
<문제풀이>
JVM : 자바 가상 기계로써 자바 프로그램을 해석하고 실행할 수 있는 가상의 운영체제
JVM은 운영체제에 종속적이기 때문에 운영체제에 맞게 설치되어야 한다.
3. 자바 프로그램 개발 과정을 순서대로 나열하세요.
① javac.exe로 바이트 코드 파일(~.class)을 생성한다.
② java.exe로 JVM을 구동시킨다.
③ 자바 소스 파일(~.java)을 작성한다.
④ JVM은 main() 메소드를 찾아 메소드 블록을 실행시킨다.
<정답>
③ 자바 소스 파일(~.java)을 작성한다. → ① javac.exe로 바이트 코드 파일(~.class)을 생성한다.
→ ② java.exe로 JVM을 구동시킨다. → ④ JVM은 main() 메소드를 찾아 메소드 블록을 실행시킨다.
<문제풀이>
자바 프로그램을 개발하기 위해서는 우선 파일 확장명이 .java인 텍스트 파일을 생성하고 프로그램 소스를 작성한다. 작성 완료된 자바 소스 파일은 컴파일러(javac.exe)로 컴파일 해야한다. 컴파일이 성공되면 확장명이 .class인 바이트 코드 파일이 생성된다. 그리고 바이트코드를 java.exe 명령어를 실행하면 JVM을 구동시켜 바이트 모드 파일을 메모리로 로드하고, 최적의 기계어로 번역한 다음 main()메소드를 찾아 실행시킨다.
4. 자바 소스 파일을 작성할 때 틀린 것은 무엇입니까?
① 자바 소스 파일명과 클래스 이름은 대소문자가 동일해야 한다.
② 클래스 블록과 메소드 블록은 반드시 중괄호 {}로 감싸야 한다.
③ 실행문 뒤에는 반드시 세미콜론(;)을 붙여야 한다.
④ 주석은 문자열 안에도 작성할 수 있다.
<정답>
④ 주석은 문자열 안에도 작성할 수 있다.
<문제풀이>
주석문은 코드 내 어디서든 작성이 가능하지만. 문자열(" ") 내부에는 올 수 없다.
5. 자바 주석문의 종류가 아닌 것은 무엇입니까?
① // : 행 주석
② /*…*/ : 범위 주석
③ /**…**/ : API 도큐먼트 주석
④ <!--…--> : 범위 주석
<정답>
④ <!--…--> : 범위 주석
<문제풀이>
범위 주석은 /*…*/ 로 활용되고. /**…**/ 는 javadoc.exe명령어로 API 도큐먼트로 생성하는데 사용되는 도큐먼트 주석이다.
6. 이클립스에 대한 설명으로 틀린 것은 무엇입니까?
① 이클립스는 JDK(JRE)를 설치해야만 실행할 수 있다.
② 이클립스에서는 소스 파일을 저장하면 자동 컴파일되어 바이트 코드 파일이 생성된다.
③ 워크스페이스는 프로젝트들이 생성되는 기본 디렉토리를 말한다.
④ .metadata는 프로젝트의 소스 파일들이 저장되는 디렉토리이다.
<정답>
④ .metadata는 프로젝트의 소스 파일들이 저장되는 디렉토리이다.
<문제풀이>
이클립스 : 자바 프로그램을 개발하기 위한 통합 개발 환경(IDE Integrated Development Environments) 제공
(프로젝트 생성, 자동 코드 완성, 디버깅 기능을 가지고 있다.)
.metadatat는 이클립스를 사용하면서 변경되는 속성값이 저장되는 디렉토리이다.
자바의 소스파일은 src 디렉토리에, 바이트 코드 파일은 bin 디렉토리에 기본적으로 저장된다.
02 변수와 타입
1. 자바에서 변수에 대한 설명 중 틀린 것은 무엇입니까?
① 변수는 하나의 값만 저장할 수 있다.
② 변수는 선언 시에 사용한 타입의 값만 저장할 수 있다.
③ 변수는 변수가 선언한 중괄호({}) 안에서만 사용 가능하다.
④ 변수는 초기값이 저장되지 않은 상태에서 읽을 수 있다.
<정답>
④ 변수는 초기값이 저장되지 않은 상태에서 읽을 수 있다.
<문제풀이>
변수는 초기화가 되어야 읽을 수가 있고, 초기화되지 않은 변수는 읽을 수가 없다.
2. 변수 이름으로 사용 가능한 것을 모두 선택하세요?
① modelName ② class ③ 6hour ④ $value ⑤ _age ⑥ int
<정답>
① modelName (카멜 표기법) / ④ $value / ⑤ _age
<문제풀이>
- 변수 명명 규칙(필수) -
- 첫 번째 글자는 문자이거나 '$','_'이어야 하고 숫자로 시작할 수 없다.
- 영어 대소문자가 구분된다.
- 문자 수 (길이)의 제한은 없다.
- 자바 예약어는 사용할 수 없다. (기본 데이터 타입, 접근 지정자, 클래스, 객체, 메소드, 제어문, 논리값, 예외 처리 관련 등)
- 관례적으로 첫 문자는 영어 소문자로 시작하되, 다른 단어가 붙을 경우 첫 문자를 대문자로 한다.
② class : 예약어는 변수 이름으로 사용할 수 없다.
③ 6hour : 변수 이름은 숫자로 시작할 수 없다.
⑥ int : 예약어는 변수 이름으로 사용할 수 없다. int는 데이터 타입명으로만 사용할 수 있다.
3. 다음 표의 빈칸에 자바의 기본 타입(Primitive Type) 8개를 적어보세요.
크기/타입 1byte 2byte 4byte 8byte 정수타입 (1) (2)
(3)(4) (5) 실수타입 (6) (7) 논리타입 (8)
<정답>
크기/타입 | 1byte | 2byte | 4byte | 8byte |
정수타입 | (1) byte | (2) char (3) short |
(4) int | (5) long |
실수타입 | (6) float | (7) double | ||
논리타입 | (8) boolean |
<문제풀이>
모든 변수에는 타입(type, 형)이 있으며, 타입에 따라 저장할 수 있는 값의 종류와 범위가 달라진다. 기본(원시)타입이란 정수, 실수, 문자, 논리 리터럴을 직접 저장하는 타입을 말한다. 정수 타입의 데이터 타입은 byte, char, short, int, long이 있고, 실수 타입의 데이터 타입은 float, double, 논리타입의 데이터 타입은 boolean이 있다.
값의 종류 | 기본 타입 | 메모리 사용 크기 | |
정수 | byte | 1byte | 8bit |
char | 2byte | 61bit | |
short | 2byte | 16bit | |
int | 4byte | 32bit | |
long | 8byte | 64bit | |
실수 | float | 4byte | 32bit |
double | 8byte | 64bit | |
논리 | boolean | 1byte | 8bit |
4. 다음 코드에서 타입, 변수, 리터럴에 해당하는 것을 적어보세요.
int age;
age = 10;
double price = 3.14;
타입: (1), (2)
변수 이름: (3), (4)
리터럴: (5), (6)
<정답>
타입: (1) int , (2) double
변수 이름: (3) age, (4) age
리터럴: (5) 10, (6) 3.14
<문제풀이>
코드에서 타입이란 데이터의 타입을 뜻하고, 리터럴은 소스 코드 내에서 직접 입력된 변수의 초기값을 뜻한다.
변수 이름은 작성자가 별도의 이름을 정하여 리터럴 값을 저장할 수 있는 메모리 공간을 뜻한다.
위의 코드에서 int age; 로 int 타입의 변수 age를 선언하였고, age = 10; 에서 변수 age에 리터럴 값 10을 저장하였다.
그리고 마지막 doble price=3.14; 에서 double 타입의 변수 price를 선언함 과 동시에 리터럴 값 3.14를 저장하였다.
이처럼 변수는 선언 후에 리터럴 값을 따로 저장할수도 있고, 선언과 동시에 리터럴 값을 저장할수도 있다.
5. 자동 타입 변환에 대한 내용이다. 컴파일 에러가 발생하는 것은 무엇입니까?
byte byteValue = 10;
char charValue = 'A';
① int intValue = byteValue;
② int intValue = charValue;
③ short shortValue = charValue;
④ double doubleValue = byteValue;
<정답>
③ short shortValue = charValue;
<문제풀이>
자동 변환 타입( Promoion)은 프로그램 실행 도중에 자동적으로 타입 변환이 일어나는 것을 말한다.
자동 타입 변환은 작은 크기를 가지는 타입이 큰 크기를 가지는 타입에 저장될 때 발생한다.
① int intValue = byteValue;
→ int 타입은 4byte, byte 타입은 1byte 크기이므로 int가 더 큰 크기의 타입이기 때문에 byte 타입을 int 타입으로 자동 변환시킬 수 있다.
② int intValue = charValue;
→ int 타입은 4byte, char 타입은 2byte 크기이므로 int가 더 큰 크기의 타입이기 때문에 char 타입을 int 타입으로 자동 변환시킬 수 있다.
③ short shortValue = charValue;
→ 예외적으로 char 타입은 2byte의 크기를 가지지만, char의 범위는 0~54424이므로 음수가 저장될 수 없다.
음수가 저장될 수 있는 short 타입을 char 타입으로 자동 변환시킬 수 없다. 또한 반대로 char 타입의 최대값이 shor 타입의 최대값보다 크기 때문에 char 타입을 short 타입으로 자동 변환시킬 수 없다.
④ double doubleValue = byteValue;
→ double 타입은 8byte, byte 타입은 1byte 크기이므로 double이 더 큰 크기의 타입이기 때문에 byte 타입을 double 타입으로 자동 변환시킬 수 있다.
6. 강제 타입 변환(Casting)에 대한 내용입니다. 컴파일 에러가 발생하는 것은 무엇입니까?
int intValue = 10;
char charValue = 'A';
double doubleValue = 5.7;
String strValue = "A";
① double var = (double) intValue;
② byte var = (int) doubleValue;
③ int var = (int) doubleValue;
④ char var = (char) strValue;
<정답>
④ char var = (char) strValue;
<문제풀이>
큰 크기의 타입은 작은 크기의 타입으로 자동변환을 할 수 없다. 이와 같이 강제적으로 큰 데이터의 타입을 작은 데이터 타입으로 쪼개어서 저장하는 것을 강제 타입 변환(Casting, 캐스팅)이라고 한다.
① double var = (double) intValue;
→ double 타입은 8byte, int 타입은 4byte 크기이므로 int 타입의 intValue에 저장된 10의 값은 double 타입으로 강제 타입 변환하여 저장할 수 있다. 정수 타입의 데이터를 실수 타입의 데이터로 저장할 때는 자동 타입 변환이 되지만 명시적으로 강제 타입 변환을해도 컴파일 에러가 발생하는 것은 아니다.
② byte var = (int) doubleValue;
→ doubleVlaue값을 int 타입으로 강제변환하면 소수점 이하 부분은 버려지고, 정수 부분만 저장되어 5의 값을 가지게 되고, double 데이터를 강제 타입 변환하여 int 타입으로 저장할 수 있다. int 타입으로 변환된 5의 값은 -128 ~ 127의 범위의 정수를 저장할 수 있는 byte 타입에 저장이 가능하다.
③ int var = (int) doubleValue;
→ doubleVlaue값을 int 타입으로 강제변환하면 소수점 이하 부분은 버려지고, 정수 부분만 저장되어 5의 값을 가지게 되고, double 타입의 데이터를 강제 타입 변환하여 int 타입으로 저장할 수 있다.
④ char var = (char) strValue;
→ 참조 타입의 변수에 저장된 문자열은 객체 타입이므로 원시 타입의 char 타입으로 강제 타입 변환할 수 없다.
7. 변수를 잘못 초기화한 것은 무엇입니까?
① int var1 = 10;
② long var2 = 10000000000L;
③ char var3 = ''; //작은 따옴표 두 개가 붙어 있음.
④ double var4 = 10;
⑤ float var5 = 10;
<정답>
③ char var3 = ''; //작은 따옴표 두 개가 붙어 있음.
<문제풀이>
③ char var3 = ''; //작은 따옴표 두 개가 붙어 있음.
→ char 타입은 공백 문자는 허용하지만 빈문자는 허용하지 않는다.
(참고) ⑤ float var5 = 10;
→ float var6 = 10.0; 이었다면 기본적으로 실수 리터럴은 double 타입으로 간주되기 때문에 8byte의 double 타입인 리터럴 값 10.0을 4byte인 float 타입으로 자동변환 할 수 없고, float 타입에 저장하기 위해서는 10.0f / 10.0F로 저장해야한다.
8. 연산식에서의 타입 변환 내용입니다. 컴파일 에러가 생기는 것은 무엇입니까?
byte byteValue = 10;
float floatValue = 2.5F;
double doubleValue = 2.5;
① byte result = byteValue + byteValue;
② int result = 5 + byteValue;
③ float result = 5 + floatValue;
④ double result = 5 + doubleValue;
<정답>
① byte result = byteValue + byteValue;
<문제풀이>
연산식에서의 자동 타입 변환은 서로 다른 타입의 피연산자가 있을 경우 두 피연산자 중 크기가 큰 타입으로 자동 변환된 후 연산을 수행한다.
① byte result = byteValue + byteValue;
→ int 타입 이하의 정수를 산술연산 하였을때는 int 타입으로 자동 타입 변환되므로 int 타입 + int 타입으로 연산되어 int 타입에 저장되어야한다.
② int result = 5 + byteValue;
→ 정수 5와 byte 타입을 산술연산하면 byte 타입이 int 타입으로 자동 타입 변환 되고, 정수 5 또한 int 타입으로 자동 타입 변환되므로 int 타입에 저장할 수 있다.
③ float result = 5 + floatValue;
→ 정수 5와 float 타입을 산술연산하면 5가 float 타입으로 자동 타입 변환 되므로 float 타입에 저장할 수 있다.
④ double result = 5 + doubleValue;
→ 정수 5와 double 타입을 산술연산하면 5가 double 타입으로 자동 타입 변환되므로 double 타입에 저장할 수 있다.
01장, 02장 문제를 풀어보고, 헷갈리거나 모르는 내용들은 교재를 찾아보고 공부하면서
잘 모르고 지나쳤던 내용들도 새롭게 공부하고 익힐 수 있었고,
기본적인 내용들에 대해 조금 더 정확하게 숙지를 할 수 있는 계기가 되었다.
기본에 충실해야 더 나아가 발전할 수 있는것이라 생각하고, 기초부터 탄탄하게 더 열심히 공부해야겠다!