👶주니어 자바 개발자를 위한 100가지 질문-기초
- -
주니어 자바 개발자를 위한 100가지 질문
평소에 조금씩 자바 공부를 하고 있는데 기초적인 부분에 대해 너무 많이 모른다는 생각을 자주 했다. 그러던 와중 커리어리에 올라와 있는 조서희님의 주니어 자바 개발자를 위한 100가지 질문이라는 글을 보았다. 글을 보니 아직 모르는 내용도 많고 중요한 내용도 많은 것 같아 따로 정리하려고 한다.
처음 보시는 분들은 질문에 대해 먼저 고민해보고 토글을 열어 보는 것을 추천한다. 또한 답변의 정확하지 않을 수 있으므로 피드백은 환영!
기초
📌 JDK와 JRE의 차이점은 무엇입니까?

JRE(Java Runtime Envieronment): 자바 실행 환경이다. JVM(Java Virtual Machine)와 Java binaries, java 클래스 라이브러리를 포함하여 자바 프로그램의 실행을 지원한다.

JDK(Java Development Kit): 자바 개발 키트이다. JDK는 자바 애플리케이션을 개발하기 위한 환경을 지원한다. JDK는 JRE를 포함할 뿐만 아니라 컴파일러(javac), javadoc, jar 등 개발에 유용한 도구들을 포함하고 있다. 따라서 자바 프로그램을 개발하기 위해서는 JDK를 다운로드 하여야한다.
📌 ==와 equals의 차이점은 무엇입니까?

위 사진은 실제로 Object클래스에서 구현되어 있는 equals메서드이다. 일반적으로 equals를 오버라이딩 하지 않은 객체간 비교를 할때에는 ==과 equals와 같은 동작을 한다.
public class Main {
public static void main(String[] args) {
String str1 = new String("Hello!");
String str2 = new String("Hello!");
System.out.println(str1.equals(str2));
}
}
하지만, 위의 코드에서 str1 과 str2 는 분명 다른 객체이므로 false 여야 하지만 정답은 true이다.

왜냐하면 String에서는 위와같이 equals를 오버라이딩하여 내용을 비교하도록 구현하기 때문이다. 결과적으로 ==과 equals의 차이는 ==는 객체간 비교 equals는 객체 또는 객체 내용비교를 구현에 맞추어서 오버라이딩하여 바꿀수 있다는 점이다.
📌 두 객체가 동일한 hashCode를 가지면 Equals()가 참이어야 합니다, 그렇죠?
💡hashCode는 해싱 기법에 사용되는 해시함수를 구현한 것이다.
😲일반적으로 해시코드가 같은 두 객체가 존재하는 것이 가능하지만, Object클래스에 정의된 hashCode메서드는 객체의 주소값으로 해시코드를 만들어 반환하기 때문에 32bit JVM에서는 절대 같은 해시코드를 가질 수 없었지만, 64bit JVM에서는 8byte 주소값으로 해시코드(4byte)를 만들기 때문에 해시코드가 중복될 수 있다.
📌 자바에서 final의 기능은 무엇입니까?
💡final은 ‘최종적’이라는 뜻을 가지고 있다. final 필드는 초기값이 저장되면 최종적인 값이되어 프로그램 실행 도중에 수정을 할 수 없다.
이외에도 변수, 메서드, 클래스에 붙을 때에 각각의 기능과 의미가 있다.
변수 : 값이 변경되지 않도록 한다.
메서드 : 메서드가 오버라이드 되지 않도록 한다.
클래스 : 클래스를 상속하지 못하도록 만든다.
📌 자바에서 Math.round(-1.5)는 무엇을 의미합니까?
💡Math.round()메서드는 .5 의 절반값을 나타낼 때 더 큰 자연수 값으로 반올림한다. 그러므로 Math.round(-1.5)의 값은 -1을 의미한다.
*BigDecimal클래스에서는 HALF_UP (5이상 올림), HALF_EVEN (반올림 자리값이 짝수면 HALF_UP, 홀수면 HALP_DOWN), HALP_DOWN (6이상 올림)의 3가지 반올림 방법을 사용할 수 있다.
BigDecimal divide(BigDecimal divisor, RoundingMode roundingMode); //나눗셈 결과를 어떻게 할것인지
BigDecimal bd = new BigDecimal("3");
System.out.println(bd.divide(new BigDecimal("2"), RoundingMode.HALF_UP)); // 2
📌 String은 기본 데이터 타입입니까?
💡String은 int, char .. 과 같은 기본 데이터 타입이 아닌 참조 데이터 타입으로 분류된다. 즉 Stack영역이 아닌 Heap영역에서 문자열 데이터가 생성되고 다뤄진다는 말이다.
또한 String은 불변이라, String str = “a”; str+”b” 일때, “a”메모리에 글자를 더하는게 아닌 “ab”메모리를 새로 만들어 주소를 재 참조 하는 형식이다.
📌 자바에서 문자열을 조작하는 클래스는 무엇이 있습니까? 각 클래스의 차이점은 뭘까요?
💡문자열을 다룰 때, String의 불변성 때문에 문자열을 조작하면서 성능적인 낭비가 발생하는 경우가 있다. 이때, StringBuffer또는 StringBuilder를 사용하여 문자열을 조작하면 성능상 이점을 취할 수 있다.
StringBuffer vs StringBuilder
StringBuffer는 멀티쓰레드에 안전하도록 동기화되어 있다. 동기화는 StringBuffer에 대한 성능을 떨어뜨리게 된다. 그러므로 멀티쓰레드로 작성되지 않은 프로그램인 경우 쓰레드의 동기화만 빠진 StringBuilder를 사용하는 것이 이득이다.
📌 String str ="i"와 String str = new String("i")가 동일합니까?

- 동일하지 않다. str = “i” 는 i라는 문자열 상수가 만들어지며 이는 JVM에서 관리하는 String constant pool에 저장된다. 또한 새로 String 객체를 생성하는 new String(”i”)는 JVM이 관리하는 heap공간에 저장된다.
- 또한 String str2 = “i” 를 선언하고 str과 비교를 했을 때에는 두 변수가 같은 주소를 가리키며, String str2 = new String(”i”); 은 다른 주소를 가리킨다.
📌 문자열을 반전시키는 가장 좋은 방법은 무엇인가요?
대표적으로 두 가지 방법이 있을 것 같다. 직접 리스트를 만들어 반복문으로 변경 시키는 방법. 라이브러리의 메서드를 이용하는 방법(StringBuilder 또는 StringBuffer 등)
1. 메서드를 이용하는 방법(StringBuilder)

reverse메서드는 AbstractStringBuilder에서 구현되었다.

아래 메서드를 보면 배열에 첫 번째와 마지막인덱스변경하고 두 번째와 마지막 - 1 인덱스를 변경하는 방식으로 구현이 되어있다.

2. 직접 리스트를 만들어 반복문으로 변경시키는 방법

아무래도 전체적인 코드들을 살펴봤을 때 구현되어 있는 reverse()메서드를 사용하는 방식이 효율적이고 코드의 수도 줄일 수 있어서 좋은 방법이라 생각된다. 상황에 따라 다르겠지만 특별한 경우가 아니고는 실제로 구현하는 것보다 직접 쓰는 걸 추천한다.
📌 String 클래스의 일반적인 메서드는 무엇이 있나요?
- endWith: 문자열 마지막에 지정한 문자가 있는지를 판단 후 있으면 true, 없으면 false를 반환한다.
- equals: 원래는 Object의 메서드이다. 기본적으로 객체를 비교하지만 Stirng에서는 오버라이드를 하여 값을 비교한다. 이와 마찬가지로 hashCode 또한 값을 해싱하여 반환한다. 두 개의 String에 값만을 비교해서 같으면 true, 다르면 false를 반환한다.
- indexOf: 지정한 문자가 문자열에 몇 번째에 있는 지를 반환한다.
- length: 문자열의 길이를 반환한다.
- replace:문자열에 지정한 문자" "가 있으면 새로 지정한 문자" "로 바꿔서 출력한다.
- substring:문자열에 지정한 범위에 속하는 문자열을 반환한다.(시작 범위에 값은 포함하고, 끝나는 범위에 값은 포함하지 않는다.
이 외에도 toLowerCase, toUpperCase, trim, valueOf, charAT 등 많은 메서드를 가지고 있다.
📌 추상 클래스에서 추상 메서드는 필수적인가요?
✅추상 클래스
💡추상 클래스는 객체 지향 프로그래밍에서 중요한 특징인 다형성을 가지는 메소드의 집합을 정의할 수 있도록 해준다. 반드시 사용되어야 하는 메소드를 추상 클래스에 추상 메소드로 선언해 놓으면, 이 클래스를 상속받는 모든 클래스에서는 이 추상 메소드를 반드시 재정의해야 한다.
✅추상 메서드
💡추상 메소드(abstract method)란 자식 클래스에서 반드시 오버라이딩해야만 사용할 수 있는 메소드를 의미한다. 자바에서 추상 메소드를 선언하여 사용하는 목적은 추상 메소드가 포함된 클래스를 상속받는 자식 클래스가 반드시 추상 메소드를 구현하도록 하기 위함이다.
추상 클래스와 추상 메서드의 정의는 다음과 같고, 사실 추상 클래스는 추상 메서드가 존재할 수 있다는 것 외에 일반 클래스랑 다를 바가 없다. 심지어 추상 메서드를 포함시키는 것도 강제가 아니다.
📌 보통의 클래스와 추상 클래스의 차이는 무엇인가요?
- 클래스의 상속에서는 부모의 메서드를 오버라이딩하는 것이 필수가 아니며, 자식에게 특정 메서드를 구현하라고 강요할 수 없다.
- 추상 클래스는 추상 메서드를 자식 클래스가 구현하는 것이 강제이기 때문에 해당 클래스를 상속받는 모든 자식 클래스들은 반드시 해당 메서드를 구현해야 한다.
📌 final은 추상 클래스를 수정할 때 사용할 수 있나요?
final 키워드가 클래스 앞에 붙으면 해당 클래스는 상속을 받을 수 없는 클래스로 선언하는 것이다. 추상클래스는 자체로 인스턴스화가 불가능하고, 상속을 받아 구현할 수 있는데, 이를 금지하게 된다면 사용할 수 없는 클래스가 되는 것이다.
💡애초에 final과 abstract는 같이 붙을 수 없으며, 컴파일 단계에서 에러가 나게 된다.
'Java' 카테고리의 다른 글
👶주니어 자바 개발자를 위한 100가지 질문 - java Web, 예외클래스 (1) | 2023.09.11 |
---|---|
👶주니어 자바 개발자를 위한 100가지 질문 - Reflection, Object Copy (0) | 2023.09.04 |
👶주니어 자바 개발자를 위한 100가지 질문-Container, Multi-Threading (1) | 2023.08.30 |
자바 코드 컨벤션 (2) (0) | 2023.06.30 |
자바 코드 컨벤션 (1) (0) | 2023.06.30 |
소중한 공감 감사합니다