18장. 이제 기본 문법은 거의 다 배웠으니 정리해 봅시다

공부하는 감자·2023년 12월 9일
0

자바의 신 3판

목록 보기
18/30

들어가기 전

『자바의 신 3판』 을 읽고 내용 정리 및 공부한 내용을 정리한 글입니다.
서적: 자바의 신 3판 구입처

18장의 내용은 앞 장들의 내용을 요약하고 정리한 것으로, 내용 정리는 건너 뛰고 책에 있는 문제만 풀어보았다.

정리해 봅시다.

💡 정답 따로 없음: 관련된 장을 참고하세요.

Q. 참조 자료형(Reference type)과 기본 자료형(Primitive type)의 차이를 정리해 주세요.

기본 자료형은 자바에서 제공하는 정수형과 boolean을 말하며, 우리가 변경하거나 만들어낼 수 없다.

참조 자료형은 기본 자료형을 제외한 나머지 타입으로, 우리가 생성해낼 수 있다.

Q. 기본 자료형 8 가지를 나열하고 각 타입의 특징을 정리해 주세요.

byte, short, int, long, char, float, double, boolean.

먼저 이 8개는 범위가 다르다. byte는 8비트, short와 char는 16비트, int는 32비트, long은 64비트로 이루어진 정수형이며, float와 double은 부동 소수점을 사용한다.

boolean은 true와 false를 값으로 갖는다.

정수형은 int를 주로 사용하는데, 작은 숫자를 사용할 경우에는 메모리 효율을 위해 byte와 short를 사용한다.

char는 2바이트의 정수형으로, 유니코드 값을 저장한다.

Q. 형 변환이란 무엇이고 왜 해야 하나요?

형 변환은 타입을 변환하는 것을 말한다. 각 정수 타입끼리 변환하거나, 상속 관계의 참조 자료형끼리 변환할 수 있다. 형 변환의 경우, 상속 관계에서 부모 클래스를 타입처럼 사용해 여러 자식을 받아 쓸 수 있는 다형성을 구현할 수 있다.

Q. if 문의 용도는 무엇이며, if-else와 if-else if 는 어떤 점이 다른지 정리해 주세요.

if는 소괄호에 조건을 넣어 그 값이 true일 경우에만 if 블록에 있는 코드들이 실행되도록 하는 조건문이다.

if-else는 if가 true이면 if블록을, false이면 else블록을 실행한다.

if-elseIf는 if부터 순차적으로 조건을 검사하여 if가 true면 if블록을, if가 false이면 elseIf의 조건을 검사하여 true일 경우 elseIf의 블록을 실행한다.

Q. switch-case 문의 용도를 정리해 주세요.

switch의 소괄호에는 변수 값이 들어오고, case에서 해당 변수 값이 특정한 값이면 하위 코드들을 실행한다. 코드는 break를 만날 때까지 계속 실행되며, 아무 조건에도 일치하지 않을 경우에도 디폴트로 실행되는 default가 있다.

하나의 변수의 값에 따라 실행되어야 하는 코드가 다르다면 switch 문을 사용한다.

Q. for, do-while, while 를 어떻게 사용하는지 1부터 10까지 더하는 코드를 예를 들어 정리해 주세요.

먼저, while문은 소괄호 안에 조건을 넣는다(while(count < 10)).

조건이 true일 동안에는 블록 안의 코드들을 계속해서 실행한다. 이는 조건을 제대로 안주면 무한 루프에 빠질 수도 있다.

do-while문은 먼저 1회 실행한 후, 조건을 검사하여 루프를 돈다.

for 문도 반복문인데 소괄호 안에 변수 초기화, 조건, 루프를 돌고 나서 변수의 값을 증감해주는 코드를 넣는다.

Q. 학생이라면 지금까지의 자신의 학점이나 등수를, 회사원이라면 지금까지의 고과를 String 배열에 넣고 출력하는 코드를 작성해 주세요.

String[] score = {"10", "20", "30", "40", "50"};
for(String s:score) {
	System.out.println(s);
}

Q. 생성자는 무엇을 하는데 사용하는 것이며, 별도로 만들지 않아도 자동으로 생성되는 생성자에 대해서 정리해 주세요.

생성자는 객체가 초기화될 때 호출되는 메소드이다.

매개변수가 없는 생성자의 경우, 별도로 만들지 않아도 컴파일 시 자동으로 만들어준다.

다만, 매개변수가 있는 생성자를 선언했을 경우에는 자동으로 만들어주지 않으니 유의해야 한다.

Q. Overloading은 무엇인가요? public void setData(int a) 라는 메소드를 원하시는 대로 Overloading 해 주세요.

오버로딩은 같은 이름의 메소드를 매개변수만 달리 해서 선언하는 것을 말한다.

public void setData(int a, int b) 혹은 public void setData(int a, String b) 등 처럼 타입을 다르게 하거나 개수를 다르게 하면 오버로딩이다.

Q. 패키지를 선언하는 위치와 이름을 지정할 때의 유의점을 정리해 주세요.

패키지는 무조건 첫 줄에 선언해야 한다. 이름은 모두 소문자로 작성하며, java와 javax는 패키지 이름으로 쓸 수 없다.

Q. 다른 패키지에 선언된 클래스를 사용하기 위한 import 는 어디 위치에 선언해야하며, static import 은 무엇인지 정리해 주세요.

import 는 패키지 선언 바로 밑 줄에 선언한다. 다른 패키지에 선언된 클래스의 static 멤버에 접근하고 싶을 경우 import static을 사용한다.

Q. 클래스란 무엇인가요? 다음의 단어들이 포함되는 문장을 작성하고, 주어진 단어의 의미도 같이 정리해 주세요.(속성, 상태)

클래스는 상태(속성)와 행위를 갖는 자바의 가장 작은 기본 단위이다. 상태는 클래스와 인스턴스 변수에 해당하고, 행위는 메소드에 해당한다.

Q. 인터페이스, abstract 클래스, 클래스, Enum 클래스가 있는데 각각의 특징 및 다른 점을 정리해 주세요.

먼저, 클래스는 일반적으로 class로 선언하는 기본 단위이다.

인터페이스는 class 대신 interface로 선언하며, 내부에는 추상 메소드가 선언된다. 추상 메소드 이외의 메소드는 허용되지 않는다(자바 버전이 올라가면서 디폴트 메소드와 스태틱 메소드는 혀용하기는 했다).

인터페이스를 상속(implements)받은 클래스는 반드시 추상 메소드를 구현해야 한다.

abstract 클래스는 추상 클래스라고도 하며, 내부에는 추상 메소드와 속이 비어있지 않은 메소드를 같이 사용할 수 있다. 일부 기능은 공통적으로 미리 만들어둬도 괜찮을 때 추상 클래스를 쓴다.

Enum 클래스는 열거형 상수 집합 클래스이다. enum이라고 선언하며, 내부에는 상수를 콤마를 구분자로 하여 열거한다.

생성자는 package-private과 private만 허용되며, 내부에 메소드를 선언할 수도 있다. 생성자를 이용해 상수 값을 선언할 수도 있다. enum 클래스는 Static 클래스여서, 바로 사용할 수 있다.

Q. instanceof 라는 연산자의 용도를 정리해 주세요.

다형성을 이용해서 인터페이스나 부모 클래스를 타입처럼 사용할 때, 자식 클래스에만 있는 변수 및 메소드들에는 접근이 불가능하다.

이럴 경우에는 자식 클래스로 다시 형 변환을 시켜주어야 하는데, 이때 어떤 자식 클래스인지(부모와 자식은 1:N 관계이므로) 확인하기 위해 사용한다.

검사할클래스 instanceof 타입 으로 적으면 true, false로 리턴된다.

Q. 어떤 클래스를 상속받아 확장을 하면, 부모 클래스의 어떤 것들을 사용할 수 있는지 정리해 주세요.

클래스를 상속 받으면 부모 클래스의 private으로 선언된 변수 및 메소드를 제외한 나머지를 모두 사용할 수 있다.

Q. 변수를 final 로 선언하는 것이 어떤 의미가 있는지 정리해 주세요.

변수를 final로 선언한 것은 이 변수는 불변한다는 의미이다.

지역 변수에서는 초기화를 나중에 해도 되지만, 나머지 변수들(인스턴스 변수, 클래스 변수)은 무조건 초기화해주어야 한다. 이렇게 선언하면 추후 값을 다시 넣을 수 없다.

참조 자료형의 변수일 경우에는 다시 할당(new)하는 것이 불가능하고, 객체 안의 값을 변경하는 것은 가능하다.

Q. 클래스를 final 로 선언하는 것이 어떤 의미가 있는지 정리해 주세요.

클래스를 final로 선언한다는 것은 다시 할당(new)하는 것이 불가능하다는 의미이다.

이때, 처음 초기화하여 생성한 객체의 변수들은 접근 및 변경이 가능하다. 클래스가 final이지 내부 변수들이 final인 것이 아니기 때문이다.

Q. 변수를 static 으로 선언하는 것이 어떤 의미가 있는지 정리해 주세요.

정적 변수라고 하며, 프로그램 내에 단 하나만 존재한다는 뜻이다.

Q. 메소드를 static 으로 선언하는 것이 어떤 의미가 있는지 정리해 주세요.

정적 메소드라고 한다. 초기화 없이 사용할 수 있으며, static으로 선언된 변수에만 접근할 수 있다.

Q. try-catch-finally 블록은 왜 사용하고 각각의 블록이 어떤 용도로 사용되는지 정리해 주세요.

예외 처리를 할 때 사용된다.

예외가 발생할 수 있는 코드를 try로 감싸고, 예외가 발생하면 catch문으로 가서 예외를 처리한다.

그리고 finally는 예외가 발생하든 발생하지 않든 무조건 실행된다.

Q. String 클래스와 StringBuilder, StringBuffer 클래스의 차이를 정리해 주세요.

String은 불변 객체이다. 이는 값의 수정이 불가능하다는 의미인데, 우리가 String을 사용할 때 값을 변경하면 기존의 값이 변경되는 것이 아니라 새로운 값으로 메모리를 할당하고 그곳을 바라보게 설계되어 있다.

특히, 따옴표(리터럴)로 선언되었을 경우에는 String constance pool에 동일한 값이 있는지 여부를 체크한 후, 있으면 해당 메모리 주소를 보게 하고 없으면 새로 할당한 후 그곳을 보게 되어 있다.

그러나 new String으로 선언하면 무조건 메모리 공간을 하나 할당받은 후 그곳을 바라보게 한다.

이 때, 메모리 공간의 절약을 위해 나온 것이 StringBuilder와 StringBuffer이다. 이 두 개 클래스는 초기에 일정한 메모리 공간을 할당받고, 값이 변경할 경우 그 메모리 안에서 변경한다. 만약 범위를 넘어서면 늘려주는 작업도 알아서 한다.

StringBuilder 와 StringBuffer는 사용하는 방법이 같은데, Thread Safe한지 여부가 다르다. StringBuffer는 Thread safe하고, StringBuilder는 Thread safe하지 않다. 속도는 후자가 더 빠르다.

Q. String 클래스의 indexOf(), substring(), split(), getBytes() 메소드가 어떤 용도로 사용되는지 정리해 주세요.

indexOf()는 문자열에서 매개 변수로 입력 받은 값이 있는지 확인하여, 없으면 -1을 있으면 해당 위치를 반환한다.

substring()은 문자열을 매개 변수로 입력 받은 범위로 잘라서 반환한다.

split()은 매개변수로 입력 받은 값을 구분자로 문자열을 잘라서, String 배열로 반환한다.

getBytes()는 문자열을 바이트로 변환하는 메소드이다. 이 과정을 인코딩한다고 한다.

profile
책을 읽거나 강의를 들으며 공부한 내용을 정리합니다. 가끔 개발하는데 있었던 이슈도 올립니다.

0개의 댓글