요약 문제 풀이
1. 참조 자료형(Reference type)과 기본 자료형(Primitive type)의 차이를 정리해 주세요.
참조 자료형: 기본 자료형을 제외한 자료형으로 초기화 시 new와 생성자를 지정해 객체를 만들어야하며 매개 변수로 값을 넘겨줄때 Pass By Reference에 의해 값이 아닌 참조 주소값이 전달되어 값이 변경되면 원본에 영향을 미친다.
기본자료형: 8개가 있으며 boolean, byte,short, int, long, char, double, float이 있으며 초기화 시 값을 바로 지정해줄 수 있으며 매개 변수로 값을 넘겨줄 경우 Pass By Value에 의해 원본 값이 복사되어 전달되기에 값이 변경되어도 원본에 영향을 미치지않는다.
2. 기본 자료형 8 가지를 나열하고 각 타입의 특징을 정리해 주세요.
크게 boolean과 숫자 타입으로 나뉘며 숫자 타입은 정수형과 실수형 타입으로 나뉜다.
boolean은 true, false만 리턴하는 타입
정수형으로는 byte, short, int, long, char 가 있고 long은 숫자 뒤에 L을 붙여야하며 각각 8, 16, 32, 64, 16비트의 범위를 가지고 있다.
실수형으로는 float, double이 있고 float은 숫자 뒤에 F를 붙여야한다.
3. 형 변환이란 무엇이고 왜 해야 하나요?
형 변환은 서로 다른 타입 사이에서 다른 타입으로 변환하는 작업이다.
범위가 작은 타입에서 큰 타입으로 형 변환 시 컴파일러에 의 자동(묵시적)으로 형 변환
범위가 큰 타입에서 작은 타입으로 형 변환 시 명시적으로 형 변환을 해줘야 하며 데이터 손실이 생길 수 있다.
4. if 문의 용도는 무엇이며, if-else와 if-else if 는 어떤 점이 다른지 정리해 주세요.
if 문은 조건문으로 변수들의 상태에 따라 분기할 필요가 있을 때 사용한다.
if-else는 if문 조건을 판단 후 true인 경우 if의 처리문장을, false인 경우에 else의 처리문장을 수행한다.
if-else if는 여러 개의 조건식을 두고 조건을 판단해 수행하도록 하는 조건문이다.
5. switch-case 문의 용도를 정리해 주세요.
여러 범위에 걸쳐서 비교되어야 할 때 하나의 값으로 분기하여 비교하는 방식의 조건
6. for, do-while, while 를 어떻게 사용하는지 1부터 10까지 더하는 코드를 예를 들어 정리해 주세요.
// for문
int result = 0;
for (int i = 1; i <= 10; i++) {
result += 1;
}
// while문
int i=1;
int result = 0;
while (i <= 10) {
result += i++;
}
// do-while문
int i=1;
int result = 0;
do {
result += i++;
} while (i <= 10);
7. 학생이라면 지금까지의 자신의 학점이나 등수를, 회사원이라면 지금까지의 고과를 String 배열에 넣고 출력하는 코드를 작성해 주세요.
String[] grades = {"4.25", "3.81", "3.67", "3.58", "3.75", "4.16", "4.25", "3.9"};
for (String grade : grades) {
System.out.println(grade);
}
8. 생성자는 무엇을 하는데 사용하는 것이며, 별도로 만들지 않아도 자동으로 생성되는 생성자에 대해서 정리해 주세요.
생성자는 클래스의 객체를 생성하는데 필요하다.
별도로 생성자를 선언하지 않으면 매개 변수가 없는 기본 생성자가 컴파일러에 의해서 자동으로 생성된다.
9. Overloading은 무엇인가요? public void setData(int a) 라는 메소드를 원하시는 대로 Overloading 해 주세요.
오버로딩은 메소드 선언 시 메소드 명은 같지만 매개 변수를 다르게 선언하는 방식으로 동일한 기능은 하지만 메소드에 넘겨줄 수 있는 매개 변수를 다양하게 함으로 다른 개발자들이 쉽게 구현할 수 있게 하기 위한 방식이다.
int data1;
String data2;
// 기존의 setData() 메소드
public void setData(int a) {
data1 = a;
}
// 기존 setData() 메소드를 Overloading
public void setData(String a) {
data2 = a;
}
10. 패키지를 선언하는 위치와 이름을 지정할 때의 유의점을 정리해 주세요.
패키지 선언 시 소스의 가장 첫 에 선언해야한다.
package로 시작하며 하위 패키지로 내려갈 때마다 .을 통해 구분한다.
패키지명에 예약어가 포함되면 안되며 소문자로 작성한다.
이름이 java, javax로 시작해서는 안된다.
11. 다른 패키지에 선언된 클래스를 사용하기 위한 import 는 어디 위치에 선언해야하며, static import 은 무엇인지 정리해 주세요.
패키지 선언 후, 클래스 선언 전에 import를 선언해야한다.
static import는 다른 클래스에서 static으로 선언된 변수 / 메소드를 참조하기 위해서 사용한다.
12. 클래스란 무엇인가요? 다음의 단어들이 포함되는 문장을 작성하고, 주어진 단어의 의미도 같이 정리해 주세요.(행위, 상태)
클래스는 "상태"와 "행위"를 갖는 자바의 기본 단위다.
상태는 클래스에서 클래스 변수, 인스턴스 변수로 나타낼 수 있다.
행위는 클래스에서 메소드로 표현할 수 있다.
13. 인터페이스, abstract 클래스, 클래스, Enum 클래스가 있는데 각각의 특징 및 다른 점을 정리해 주세요.
인터페이스 : 인터페이스 내 메소드들은 선언만 되어있고 구현되서는 안된다.
implements를 통해 인터페이스를 구현할 수 있다.
인터페이스를 구현하는 클래스의 경우 인터페이스 내 모든 메소드들을 구현해줘야한다.
abstract 클래스 : 클래스 내 abstract 메소드가 하나라도 있으면 무조건 abstract 클래스로 선언해야 한다.
abstract 메소드가 존재하지 않아도 abstract 클래스가 될 수 있다.
구현된 메소드가 존재할 수 있지만 abstract 메소드는 구현되어 있으면 안된다. (선언만 되어있어야 한다.)
abstract 클래스를 상속(확장) 시 extends를 사용해 상속 받을 수 있다.
클래스 : 변수와 메소드로 이루어져있는 자바의 기본 단위다.
모든 메소드들은 구현되어 있어야한다.
Enum 클래스 : 상수를 열거하기 위한 용도의 클래스
Enum 클래스 내 상수는 이름만 정의할 수 있다.
생성자를 통해 상수의 값을 지정할 수 있다.
메소드를 만들어 기능을 추가할 수 있다.
14. instanceof 라는 연산자의 용도를 정리해 주세요.
instanceof 연산자 : 객체가 어떤 클래스인지, 어떤 클래스를 상속받았는지 확인하는데 사용하는 연산자이다.
즉, 참조 변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 해당 연산자를 사용한다.
ㅡ> 객체명 instanceof 클래스타입 형태
부모의 타입에도 포함이 되기 때문에 최하위 자식 클래스 타입부터 확인해야 정확한 타입을 확인할 수 있다.
15. 어떤 클래스를 상속받아 확장을 하면, 부모 클래스의 어떤 것들을 사용할 수 있는지 정리해 주세요.
부모 클래스의 public / protected로 선언된 클래스 변수, 인스턴스 변수, 메소드를 사용할 수 있다.
16. 변수를 final 로 선언하는 것이 어떤 의미가 있는지 정리해 주세요.
변수를 final로 선언 시 값을 더 이상 바꿀 수 없는 상수가 된다.
final로 선언된 인스턴스 변수, 클래스 변수는 선언과 동시에 초기화 작업이 필요하다.
17. 클래스를 final 로 선언하는 것이 어떤 의미가 있는지 정리해 주세요.
클래스를 final로 선언 시 다른 클래스에서 상속을 받을 수 없다.
더 이상 확장해서는 안되는 클래스, 누군가 이 클래스를 상속받아 내용을 변경해서는 안되는 클래스를 선언 시 final로 선언한다.
18. 변수를 static 으로 선언하는 것이 어떤 의미가 있는지 정리해 주세요.
변수를 static으로 선언 시 객체 생성없이 접근할 수 있다.
모든 객체에서 하나의 값을 공유하여 사용한다.
static 변수 = 클래스 변수
19. 메소드를 static 으로 선언하는 것이 어떤 의미가 있는지 정리해 주세요.
메소드를 static으로 선언 시 객체 생성없이 메소드를 호출할 수 있다.
static 변수만 사용할 수 있다.
20. try-catch-finally 블록은 왜 사용하고 각각의 블록이 어떤용도로 사용되는지 정리해 주세요.
try-catch-finally 블록은 예외를 처리하기 위한 용도로 사용된다.
try : 예외가 발생하는 문장들을 묶어준다.
catch : 소괄호 안에 예외의 종류를 명시한 후 예외 발생 시 예외가 일치한다면 catch 블록 안의 예외 처리 문장을 수행한다.
finally : 예외 발생 여부와 상관 없이 어떠한 경우에도 실행되는 블록
21. String 클래스와 StringBuilder, StringBuffer 클래스의 차이를 정리해 주세요.
String : String은 immutable한 객체이므로 한 번 만들어지면 그 값을 바꿀 수 없다.
String 문자열에 + 연산을 하게 되면 값이 변경되는 것이 아닌 기존 값은 버려지고 연산을 수행한 새로운 String 객체가 생성된다.
StringBuilder : 기존 문자열에 어떤 문자열을 더하더라도 새로운 객체를 생성하지 않는다.
StringBuffer와 같은 기능을 제공하며 + 연산 대신 append() 메소드를 사용한다.
StringBuffer와 비교하면 Thread unsafe하며 속도는 더 빠르다
StringBuffer : StringBuilder와 마찬가지로 기존 문자열에 어떤 문자열을 더하더라도 새로운 객체를 생성하지 않는다.
+ 연산 대신 append() 메소드를 사용한다.
StringBuilder와 비교하면 Thread safe하며 속도는 더 느리다.
하나의 메소드 내에서 문자열을 생성해 더해주는 경우 StringBuilder를 사용해도 문제가 되지 않는다.
여러 쓰레드에서 동시에 접근해야하는 경우 반드시 StringBuffer를 사용해야한다.
22. String 클래스의 indexOf(), substring(), split(), getBytes() 메소드가 어떤 용도로 사용되는지 정리해 주세요.
indexOf() : 매개 변수로 넘어온 문자, 문자열이 해당 객체에서 존재하는 위치(index)를 반환하는 메소드로 존재하지 않는 경우 -1을 리턴한다.
substring() : 시작 인덱스, 끝 인덱스를 매개 변수로 받아 시작 인덱스부터 문자열의 끝(끝 인덱스)까지 추출해 리턴하는 메소드
split() : 매개 변수로 넘어온 정규 표현식에 따라 문자열을 문자열 배열로 리턴하는 메소드
getBytes() : 문자열을 byte 배열로 변환하는 메소드
실습 문제 풀이
직원들의 연봉 인상율을 계산하는 메소드 만들기
package c.middle;
public class CalculateSalary {
public static void main(String[] args) {
CalculateSalary calculateSalary = new CalculateSalary();
calculateSalary.calculateSalaries();
//내부 클래스 생성자 생성
//CalculateSalary.Employee employee = calculateSalary.new Employee("hi", 1, 100);
}
public long getSalaryIncrease(Employee employee) {
double salaryIncreaseRate;
final int VALUE = employee.getType();
switch (VALUE) {
case 1:
salaryIncreaseRate = (100 + (-95)) / 100.0;
break;
case 2:
salaryIncreaseRate = (100 + 10) / 100.0;
break;
case 3:
salaryIncreaseRate = (100 + 20) / 100.0;
break;
case 4:
salaryIncreaseRate = (100 + 30) / 100.0;
break;
case 5:
salaryIncreaseRate = (100 + 100) / 100.0;
break;
default:
salaryIncreaseRate = 0;
break;
}
long beforeSalary = employee.getSalary();
return (long) (beforeSalary * salaryIncreaseRate);
}
public void calculateSalaries() {
Employee[] employee = new Employee[5];
employee[0] = new Employee("LeeDaeRi", 1, 1000000000);
employee[1] = new Employee("KimManager", 2, 100000000);
employee[2] = new Employee("WhangDesign", 3, 70000000);
employee[3] = new Employee("ParkArchi", 4, 80000000);
employee[4] = new Employee("LeeDevelop", 5, 60000000);
long calculatedSalary;
for (Employee ep : employee) {
calculatedSalary = getSalaryIncrease(ep);
System.out.println(ep.getName() + "=" + calculatedSalary);
}
}
// 내부 클래스 생성
class Employee {
// 인스턴스 변수 선언
private String name; //이름
private int type; //업무 역할
private long salary; //연봉
public Employee(String name, int type, long salary) { // 생성자 선언
this.name = name;
this.type = type;
this.salary = salary;
}
// 메소드 선언
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setType(int type) {
this.type = type;
}
public int getType() {
return type;
}
public void setSalary(long salary) {
this.salary = salary;
}
public long getSalary() {
return salary;
}
}
}
출처: 이상민, <자바의 신 VOL.1> 로드북
'Java > 자바의 신 VOL.1' 카테고리의 다른 글
18. 이제 기본 문법은 거의 다 배웠으니 정리해봅시다 (1) | 2024.06.26 |
---|---|
17. 어노테이션이라는 것도 알아야한다 (0) | 2024.06.25 |
16. 클래스 안에 클래스가 들어갈 수도 있구나 (0) | 2024.06.25 |
15. String (0) | 2024.06.25 |
14. 다 배운 것 같지만, 예외라는 중요한 것이 있어요 (0) | 2024.06.24 |