📖 목차
- 1장. 프로그래밍이란 무엇인가?
- 2장. Hello God of Java
- 3장. 자바를 제데로 알려면 객체가 무엇인지를 알아야 해요
- 4장. 정보를 어디에 넣고 싶은데
- 5장. 계산을 하고싶어요
- 6장. 제가 조건을 좀 따져요
- 7장. 여러 데이터를 하나에 넣을 수는 없을까요?
- 8장. 참조 자료형에 대해서 더 자세히 알아봅시다
- 9장. 자바를 배우면 패키지와 접근 제어자는 꼭 알아야 해요
- 10장. 자바는 상속이라는 것이 있어요
- 11장. 매번 만들기 귀찮은데 누가 만들어 놓은 거 쓸 수 없나요?
- 12장. 모든 클래스의 부모 클래스는 Object에요
1장. 프로그래밍이란 무엇인가?
메서드란?
프로그램의 기능적인 부분을 모듈화하고 코드를 재사용 가능하도록 하는 것 입니다.
[접근제어자] [리턴타입] [메서드명] (매개변수) {}
클래스란?
프로그램의 기본단위이며 변수(상태)나 메서드(행동)가 있습니다.
[접근제어자] class [클래스명] {}
세미콜론의 용도와 주의사항은?
자바 코드의 한 줄이 끝날 때 세미콜론을 적어주어야 합니다.
그렇지 않으면 세미콜론이 나올 때 까지 계속 찾는데 이는 세미콜론까지 같은 줄로 인식한다는 것을 뜻합니다.
예약어란?
예약 되어 있는 단어이며 클래스, 메서드, 변수명으로 사용할 수 없습니다.
2장. Hello God of Java
커맨드 창에서 어떤 구조의 프로그램을 실행할 수 있나요?
윈도우의 cmd 창에서 어떠한 프로그램이 실행되려면 프로그램의 확장자는 exe, com, bat 중 하나로 끝나야 합니다.
프로그램을 실행하려고 명령어를 입력할 때 확장자를 붙이지 않아도 됩니다.
해당 확장자가 있는 파일을 Path 경로에서 찾아 실행할 수 있습니다.
쉽게 말하면 어떤 프로그램이 cmd 창의 아무 위치에서라도 실행할 수 있으려면 Path에 지정되어 있으면 됩니다.
현재 사용하는 윈도우에 지정되어 있는 Path를 확인하려면 cmd 창에서 "set %PATH%" 라고 명령어를 입력합니다.
커맨드 창에서 java 프로그램을 실행하는 방법은?
프로젝트의 루트 위치로 이동한 후
javac [소스코드명.java] 명령어로 코드 작성한 것을 컴파일 하고
java [소스코드] 명령어로 컴파일 한 것을 실행합니다.
javac 명령어를 사용하면 자바 파일을 컴파일러가 오류가 없나 확인한 후 정상이면 .class 파일을 생성합니다.
java 명령어를 사용할 때 .class 확장자를 작성하면 안됩니다.
자바 컴파일 및 실행 절차는?
- .java 확장자로 되어있는 소스 코드를 작성합니다.
- 소스를 컴파일러로 컴파일을 합니다.
- 컴파일 후 .class 확장자를 가진 파일을 생성합니다.
- .class 확장자를 가진 파일은 바이너리 파일이며 바이트 코드로 되어있습니다.
- .class 확장자를 가진 파일은 디스크에 저장됩니다.
- 디스크에 저장된 후 .class 파일을 JVM에서 읽어 운영체제에 전달합니다.
바이너리(binary) 파일이란?
바이너리 파일은 2진수로 채워져 있는 파일을 의미합니다.
바이너리는 0과 1로 구성된 2진법입니다.
컴퓨터가 읽기 위한 파일은 대부분 바이너리로 되어 있습니다.
main() 메서드를 작성하지 않았을 때 컴파일이 정상적으로 처리되나요?
컴파일은 정상적으로 처리되지만 클래스 파일을 실행할 때 에러가 발생합니다.
실행을 목적으로 하는 모든 자바 클래스는 main() 메서드가 반드시 있어야 합니다.
java 명령어로 실행하는 자바 프로그램의 시작점은 main() 메서드이기 때문입니다.
반드시 이름이 "main"이어야 합니다.
메서드를 static 으로 선언하면 객체를 생성하지 않아도 호출이 가능합니다.
[public] [static] [void] [main] (String[] args) {}
//는 무엇을 하는 데 사용하는 기호인가요?
코드를 작성했지만 실행하고 싶지 않을 때, 코드에 대한 설명을 남길 때 사용됩니다.
메서드를 선언할 때 반드시 있어야 하는 세 가지는?
리턴타입, 메서드명, 메서드내용
ex) void main() {}
3장. 자바를 제데로 알려면 객체가 무엇인지를 알아야 해요
객체(인스턴스)란?
실제로 존재하는 사물 입니다.
개발에서는 상태와 행위로 이루어진 것 입니다.
객체와 클래스의 차이는?
클래스는 상태와 행위로 이루어진 것을 정의할 수 있는 파일이고
객체는 클래스 기반으로 예약어 new와 생성자를 사용하여 생성하며 상태와 행위로 이루어진 것을 사용할 수 있습니다.
클래스는 하나이지만 객체는 여러 개일 수 있으며 종류도 여러 개일 수 있습니다.
여기서 말하는 종류란 생성자가 다른 객체를 의미합니다.
생성자란?
객체를 생성할 수 있는 도구입니다.
매개변수가 없는 생성자를 기본 생성자라고 하며 클래스 파일 안에 자동으로 만들어집니다.
CarManager 클래스의 main() 메서드에 Car 객체를 생성했습니다.
이 때 어떤 클래스 파일을 컴파일 해야하며 그 이유는 무엇인가요?
CarManager 클래스만 컴파일해도 됩니다.
CarManager 클래스에서 Car 클래스를 참조하기 때문에 CarManager 클래스를 컴파일할 때 Car 클래스도 같이 컴파일 합니다.
4장. 정보를 어디에 넣고 싶은데
변수의 종류는 각각 무엇인가요?
- 지역변수
- 매개변수
- 인스턴스 변수
- 클래스 변수
지역변수란?
중괄호 내에 선언된 변수입니다.
지역변수를 선언한 중괄호 내에서만 유효합니다.
** 지역변수로 기본자료형을 사용할 때 기본값이 자동으로 적용되지 않고 반드시 값을 지정해야합니다.
이는 변수를 초기화 안한 상태에서 출력 등 변수를 사용하려고 할 때 컴파일 에러가 발생합니다.
(변수만 있으면 컴파일 실행 정상)
(메서드 안에 정의한 변수에 값을 지정하지 않고 사용하면 컴파일X, 나머지는 컴파일됨)
매개변수란?
메서드에 넘겨주는 변수입니다.
메서드가 호출될 때 생명이 시작되고, 메서드가 끝나면 소멸됩니다 (참조자료형은 소멸한다고 말하기 애매)
인스턴스 변수란?
메서드 밖에, 클래스 안에 선언된 변수이며 앞에 static 예약어가 붙지 않습니다.
객체가 생성될 때 생명이 시작되고, 그 객체를 참조하고 있는 다른 객체가 없으면 소멸됩니다.
클래스 변수란?
메서드 밖에, 클래스 안에 선언된 변수이며 앞에 static 예약어가 붙습니다.
클래스가 처음 호출될 때 생명이 시작되고, 자바 프로그램이 끝날 때 소멸됩니다.
가비지 콜렉터(Garbage collector)란?
자바에서 더 이상 필요 없다고 판단하면 알아서 메모리를 청소해 주는 것입니다.
예를 들어, 가비지 콜렉터는 객체가 참조하고 있는 다른 객체가 없으면 자동으로 소멸시켜주는 일을 합니다.
아래의 에러 메시지는 무슨 의미인가요?
c:\godofjava> javac VariableTypes.java
VariableTypes.java:11: error: localVariable is already defined in anotherMethod()
int localVariable;
1 error
c:\godofjava>
anotherMethod() 메서드에 이미 localVariable 변수가 존재한다는 의미입니다.
이는 중괄호 안에 같은 변수명을 가진 변수를 선언했을 가능성이 있습니다.
변수의 명명 규칙은?
- 첫 문자는 유니코드 문자, 알파벳, $, _ 만 올 수 있습니다 (숫자X)
- 변수명이 여러단어를 합쳐놓은 형태라면 첫 문자는 소문자로 시작하되 다음 단어의 첫 문자는 대문자로 지정합니다.
(메서드 명명 규칙과 동일) - 상수는 모두 대문자로 지정하며 단어와 단어 사이에는 _로 구분을 한다.
자바의 자료형은 크게 어떻게 나눌 수 있나요?
기본자료형과 참조자료형으로 나뉩니다.
기본자료형과 참조자료형의 초기화는 어떻게 이루어지나요?
기본자료형을 초기화 할 때는 값을 바로 적어주면 됩니다.
참조자료형을 초기화 할 때는 예약어 new를 사용하여 초기화를 합니다.
(생성자를 포함하지 않은 이유는 배열이 참조자료형이지만 생성자가 없기 때문)
하지만 예외로 참조자료형 중 String만 new를 사용하여 초기화 하지 않아도 됩니다.
기본자료형은 어떻게 나눌 수 있나요?
정수형자료형, 소수형자료형으로 나뉩니다.
byte 타입에 대해 설명해주세요.
byte는 정수형 자료형이며 8비트의 부호가 있는(signed) 타입입니다.
8비트는 0과 1로 표현할 수 있는 공간이 8개가 있다는 뜻입니다. 8bit == 1byte
2^7 | 2^6 | 2^5 | 2^4 | 2^3 | 2^2 | 2^1 | 2^0 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
8개의 공간이 모두 0으로 채워지면 그 값은 0입니다.
byte 타입의 값을 구하려면 1로 채워진 공간의 값을 계산하면 됩니다. ex) 00000110 => 2^2 * 1 + 2^1 * 1 => 6
byte의 최소값은 -128, 최대값은 127 입니다.
byte 타입에서 모든 공간을 1로 채우면 127이 아닌데 byte의 최대값은 127일까?
2^7 * 1 + 2^6 * 1 + 2^5 * 1 + 2^4 * 1 + 2^3 * 1 + 2^2 * 1 + 2^1 * 1 + 2^0 * 1 = 255
byte는 부호가 있는 signed 타입이기 때문에 맨 앞에 있는 값이 0이면 양수, 1이면 음수로 지정되었습니다.
그래서 가장 왼쪽(앞)의 2^7 공간은 음수와 양수를 구분하기 위한 공간입니다.
2^6 * 1 + 2^5 * 1 + 2^4 * 1 + 2^3 * 1 + 2^2 * 1 + 2^1 * 1 + 2^0 * 1 = 127
byte 타입의 최소값은 왜 -128까지일까?
가장 왼쪽 비트가 0인 경우 (양수를 나타내는 경우) 7개의 비트로 2^7 (128)가지의 양수를 표현할 수 있습니다.
가장 오른쪽 비트가 0인 경우 (음수를 나타내는 경우) 7개의 비트로 2^7 (128)가지의 음수를 표현할 수 있습니다.
양수는 0 ~ 127, 음수는 -1 ~ -128 로 표현이 가능합니다.
구분 | 2^6 | 2^5 | 2^4 | 2^3 | 2^2 | 2^1 | 2^0 | 값 | |
양수 최대 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 127 |
음수 최소 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | -128 |
127에서 -128까지는 비트로 1밖에 차이가 안나는데 이는 스택오버플로우와 관련이 있다.
위의 표가 byte의 최소값에서 1을 빼면 최대값이, byte의 최대값에서 1을 더하면 최소값이 나오는 이유이다.
byte 타입을 만든 이유는?
적은 공간에 보다 많은 내용을 저장할 수 있도록 하기 위해 만들어졌습니다.
ex) 동영상 혹은 이미지 저장 시 사용
아래의 에러 메시지는 무슨 의미인가요?
c:\godofjava> javac PrimitiveTypes.java
PrimitiveTypes.java:22: integer number too large: 9223372036854775807
long longMax = 9223372036854775807;
1 error
c:\godofjava>
기본적으로 자바에서는 숫자를 명시하면 int로 생각합니다.
long 타입의 숫자를 명시적으로 지정햊ㄹ 때는 반드시 뒤에 L을 붙여야 합니다. 9223372036854775807L
소수형자료형을 돈 계산과 같은 중요한 부분에서 사용하면 안되는 이유는?
float과 double은 32비트와 64비트로 제공할 수 있는 범위를 벗어나면 그 값이 정확하지 않을 가능성이 높기 때문입니다.
돈 계산과 같이 정확한 계산이 요구될 때에는 java.math.BigDecimal이라는 클래스를 사용해야 합니다.
float과 double의 범위는?
float: 부호 1자리 + 지수 8자리 + 가수 23자리 = 32비트
double: 부호 1자리 + 지수 11자리 + 가수 52자리 = 64비트
char 타입의 값을 지정하는 방법은?
홑따옴표 안에 값을 넣는 방법, 홑따옴표 안에 \u와 16진수 값을 넣는 방법이 있습니다.
참고로 char 타입의 크기범위는 0 ~ 65535 입니다.
아래의 에러 메시지는 무슨 의미인가요?
error: possible loss of precision
char case1 = -1;
required: char
found : int
컴파일 자체를 실패 했으며 case1 변수에 음수를 지정할 수 없는데 지정했다는 뜻입니다.
기본자료형의 각각 기본값은?
byte = 0
short = 0
int = 0
long = 0
float = 0.0
double = 0.0
char =
boolean = false
5장. 계산을 하고 싶어요.
참조 자료형 중 + 연산이 가능한 클래스는?
String 클래스
아래의 코드 결과가 무엇인가요? 또한 그렇게 나오는 이유는?
public class OperatorMultipleDivision {
public static void main(String[] args) {
int intVal1 = 5;
int intVal2 = 10
int result = intVal1 / intVal2;
System.out.println(result);
}
}
코드 결과 : 0
수학적으로 생각한다면 결과는 0.5가 되어야 하는 것이 맞다.
하지만 그렇게 출력되지 않는 이유는 int는 정수형이기 때문이다.
만약 0.5로 출력하고 싶으면 변수 선언 시 double 타입으로 지정해야한다.
아래의 코드에서 1번과 2번의 차이점은?
public class Main{
public static void main(String[] args) {
int intVal = 1;
//1. intVal++;
//2. ++intVal;
}
}
1번과 2번은 해당 변수를 출력할 때 차이가 있다.
1번을 출력 시 기존 intVal 값인 1이 출력되고 1을 더한다.
2번을 출력 시 기존 intVal 값에서 1을 더하여 2가 출력된다.
논리 연산자 || 를 사용할 때 고려하면 좋을 점은?
논리 연산자 ||는 둘 중 하나라도 true라면 true를 반환한다.
좀 더 자세히 말하면 앞에 조건부터 계산하여 앞에있는 조건이 true라면 뒤에 있는 조건은 계산하지 않고 true를 반환한다.
이는 코드를 작성할 때 좀 더 자주 true가 되는 것을 || 앞의 조건에 작성해 주는 것이 좋다.
기본 자료형 중에서 형 변환이 전혀되는 않는 것은?
boolean
기본 자료형을 형변환 했을 때 발생할 수 있는 문제점은?
크기가 작은 타입에서 큰 타입으로 형 변환을 했을 때는 자동 형변환이 되어 문제되지 않는다. (byte -> short)
하지만 반대로 크기가 큰 타입에서 작은 타입으로 형 변환을 했을 때는 데이터의 손실이 발생할 수 있기 때문에 명시적 형변환을 해주어야 한다. (short -> byte)
형 변환 시 데이터 손실에 대해 더 제세히 말하자면, byte의 크기는 1byte이고 short의 크기는 2byte이다.
이때 short에서 byte로 명시적 형변환은 한다면 short의 앞의 1byte는 사라지게 되는 것이다.
그래서 만약 short의 값이 11110000 00000000 (1340)일 때 byte로 형 변환을 한다면 00000000 (0)이 되는 것이다.
6장. 제가 조건을 좀 따져요
아래의 코드에 대해 설명해주세요.
public class Main{
public static void main(String[] args) {
if(true);
}
}
아래의 코드에서 if문을 작성할 때 중괄호{}를 작성하지 않아도 되나요?
public class Main{
public static void main(String[] args){
if(true)
System.out.println("it is true");
}
}
switch 구문은 어떤 경우에 주로 사용하나요?
switch 구문에서 default는 어떤 역할을 하나요?
swtich 구문을 사용할 때 주의해야 할 점은 무엇인가요?
switch 구문에서 비교값으로 long 타입이 가능한가요?
switch 구문에서 비교값으로 가능한 참조 자료형을 모두 말해주세요.
switch 구문에서 continue 예약어를 사용할 수 있나요?
무한 루프(Infinite loop)란?
do-while문과 while문의 차이는 무엇이며 각각의 예시 코드를 작성해주세요.
2중 for문이나 2중 while문을 사용할 때 바깥쪽 루프의 시작점으로 이동하고 싶을 때 사용하는 예약어는 무엇이며 사용예시 코드를 작성해주세요.
7장. 여러 데이터를 하나에 넣을 수는 없을까요?
배열이란?
배열의 시간복잡도와 공간복잡도는?
배열은 기본 자료형인가요? 참조 자료형인가요?
배열을 선언하는 방법은 무엇이 있으며, 코드로 작성해주세요.
아래의 에러 메시지는 무슨 의미인가요?
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 7
at ArrayLotto.init(ArrayLotto.java:15)
at ArrayLotto.main(ArrayLotto.java:4)
모든 기본 자료형과 참조 자료형은 배열로 만들어서 사용할 수 있나요?
'Java' 카테고리의 다른 글
[JAVA] 상속 (0) | 2023.12.14 |
---|---|
[JAVA] 패키지와 접근제어자 (0) | 2023.12.14 |
[JAVA] 참조자료형의 생성자와 메서드 (0) | 2023.12.14 |
[JAVA] 배열 (1) | 2023.11.30 |
[JAVA] 조건문과 반복문 (1) | 2023.11.23 |