주니어 자바 개발자를 위한 100가지 질문 [1. 기초 ]

Eunjin·2023년 5월 22일
0

📌 JDK와 JRE의 차이점은 무엇입니까?

A. JDK는 자바 애플리케이션 개발을 위한 도구와 라이브러리를 제공하는것이며, JRE는 자바 애플리케이션을 실행하기 위한 환경을 제공하는것이다.


[정보]

JDK(Java Development Kit)란?

  • 자바 애플리케이션을 구축하기 위한 핵심 플랫폼 구성요소
  • 자바 기반 소프트웨어를 개발하기 위한 도구들로 이뤄진 패키지
  • Java 컴파일러(javac)와 디버거(jdb) 등의 개발 도구가 포함되어 있음
  • 개발자가 Java 애플리케이션을 작성하고 테스트하며, 실행 가능한 파일(JAR 또는 WAR)을 생성하는 데 필요함
    ⇒ 자바로 무언가를 만들고 싶으면 반드시 설치해야함

참고 : https://pythontoomuchinformation.tistory.com/277


JRE(Java Runtime Environment) 란?

  • 자바 런타임 환경(Java Runtime Environment)
  • 런타임 환경 : 다른 소프트웨어를 실행하기 위해 고안되는 일종의 소프트웨어
  • 자바로 만들어진 프로그램을 실행시키는데 필요한 라이브러리들과 각종 API, 그리고 자바 가상 머신 (JVM)이 포함되어 있음

⇒ 개발(쓰기)은 안되고 실행(읽기)만 된다

참고 : https://coding-factory.tistory.com/826




📌 ==와 equals의 차이점은 무엇입니까?

A. == 는 비교하고자 하는 2개의 대상의 “주소값을 비교”, equals는 비교하고자 하는 2개의 대상의 “값 자체를 비교”


문자열 비교 (== 연산자)

  • int,boolean과 같은 primitive type에 대해서는 값을 비교
  • reference type에 대해서는 주소값을 비교
public class compare {
    public static void main(String[] args) {
				//primitive type
				int a = 10;
        String s1 = "abcd";
        String s2 = new String("abcd");
		
        if(s1 == s2) {
            System.out.println("두개의 값이 같습니다.");
        }else {
            System.out.println("두개의 값이 같지 않습니다.");
        }
    }
}
=> 두개의 값이 같지 않습니다.

문자열 비교 (equals 메서드)

  • 메서드이기 때문에 “객체” 끼리 내용을 비교
  • String클래스의 equals() : 문자열을 비교하게 재정의 되어 만들어져있기 때문에 문자열 비교가 가능
  • 내부적으로 주소값을 비교하지만 String클래스에서는 equals()를 재정의해 내용을 비교하게 되어있다.
public class compare {
    public static void main(String[] args) {
        String s1 = "abcd";
        String s2 = new String("abcd");
		
        if(s1.equals(s2)) {
            System.out.println("두개의 값이 같습니다.");
        }else {
            System.out.println("두개의 값이 같지 않습니다.");
        }
    }
}
=> 두개의 값이 같습니다.

변수 생성의 차이

String str1 = "apple"; //리터럴을 이용한 방식
String str2 = "apple"; //리터럴을 이용한 방식
String str3 = new String("example"); //new 연산자를 이용한 방식
String str4 = new String("example"); //new 연산자를 이용한 방식

참고 : https://go-coding.tistory.com/35
https://coding-factory.tistory.com/536




📌 두 객체가 동일한 hashCode를 가지면 Equals()가 참이어야 합니다, 그렇죠?

A. 두 객체가 동일한 hashCode를 가지면 Equals()가 반드시 참이어야 합니다. 하지만 두 객체의 hashCode가 다르다고 해서 Equals()가 거짓일 필요는 없습니다.


hashCode란?

  • 해시 : 정보를 저장하거나 검색할 때 사용하는 자료구조
    • 정보를 어디에 저장할 것인지, 어디서 가져올 것인지 “해시 함수”를 사용하여 구현
  • 해시 알고리즘에 의해 생성된 정수 값, 객체를 식별할 수 있는 유니크한 값
  • 자바에서는 두 인스턴스가 같가면 hashCode()메서드에서 반환하는 해시 코드 값이 같아야함 → equals( ) 메서드를 재정의 했다면 hashCode( ) 메서드도 재정의해야함
  • Object의 hashCode() 메소드는 객체의 메모리 번지를 이용해서 해시코드를 만들어 리턴하기 때문에 객체 마다 다른 값을 가지고 있다.

메소드를 실행해서 리턴된 해시코드 값이 같은지를 본다. 해시 코드값이 다르면 다른 객체로 판단하고, 해시 코드값이 같으면equals()메소드로 다시 비교한다. 이 두 개가 모두 맞아야 동등 객체로 판단한다. 즉, 해시코드 값이 다른 엔트리끼리는 동치성 비교를 시도조차 하지 않는다.

<참고>
1. Do it! 자바프로그래밍 입문 p363 ~ p367
2. https://jisooo.tistory.com/entry/java-hashcode와-equals-메서드는-언제-사용하고-왜-사용할까




📌 자바에서 final의 기능은 무엇입니까?

A. 사용 위치에따라 조금씩 기능이 달라집니다.


상수를 의미하는 final

  • 상수 : 변하지 않은 수
  • 의도치 않은 값의 변경을 사전에 예방하는데 효과적

(예) final int MAX_SIZE = 100;과 같이 상수를 선언

상속할 수 없는 final 클래스

  • 클래스를 final로 선언하면 상속할 수 없음
  • 확장할수 없는 클래스
  • 보안과 관련되어 있거나 기반 클래스가 변하면 안 되는 경우에는 클래스를 final로 선언함

오버라이딩을 할 수 없는 final 메서드

  • 자식 클래스가 재정의 못하도록 부모 클래스의 메소드를 final로 만듬

<참고>
1. Do it! 자바프로그래밍 입문 p305 ~ p310




📌 자바에서 Math.round(-1.5)는 무엇을 의미합니까?

A. 주어진 실수를 가장 가까운 정수로 반올림하는 메서드이다. -2를 나타냄

Math.round()

  • 주어진 실수 값에 가장 가까운 정수를 선택합니다.
  • 만약 값이 정확히 정수로 정확히 가깝다면, 그 값 자체를 반환합니다.
  • 값이 정확히 정수와 가까운 경우에도 가장 가까운 짝수를 선택합니다.
  • long 타입의 값을 반환



📌 String은 기본 데이터 타입입니까?

A. 아니요. String은 참조 타입(reference type)입니다. 기본 데이터는boolean, byte, short, int, long, float, double, char와 같은 원시적인 데이터를 표현하는 타입을 말합니다.

String

  • 문자열 데이터를 표현하는 클래스
  • String은 객체로 취급되어 참조 타입으로 분류됨
  • 문자열의 주소를 저장하고, 해당 주소를 통해 실제 문자열 데이터에 접근함



📌 자바에서 문자열을 조작하는 클래스는 무엇이 있습니까? 각 클래스의 차이점은 뭘까요?

_A. 문자열을 조작하는 데 사용되는 주요 클래스로는 String, StringBuilder, StringBuffer가 있습니다.

  • String 클래스는 불변 문자열에 사용되며, StringBuilderStringBuffer 클래스는 가변 문자열 조작에 사용됨
  • StringBuilder는 스레드에 안전하지 않고, StringBuffer는 스레드에 안전한 버전
  • 문자열을 불변하게 유지해야 하거나 단일 스레드 환경에서 작업을 수행할 경우 String을 사용하고, 가변 문자열 조작이 필요하거나 멀티스레드 환경에서 안전한 작업이 필요한 경우 StringBuilder 또는 StringBuffer를 사용

String 클래스

  • 불변(immutable)한 문자열을 표현하기 위한 클래스
  • 한번 생성된 String객체는 변경 불가, 문자열 조작 작업을 수행할 때마다 새로운 String 객체가 생성됨
  • 문자를 빈번하게 수정할 필요가 없을 경우 사용하기 적합

StringBuilder 클래스

  • 가변(mutable)한 문자열을 표현하고 조작하는 데 사용
  • 문자열 조작 작업을 효율적으로 수행할 수 있도록 설계됨
  • 하지만, 스레드에 안전하지 않음 → 단일 스레드 환경에서는 권장됨
  • 버퍼(Buffer)를 활용하여 문자열을 문자 시퀀스(CharSequence)로 관리
public static void main(String args[]) {
  StringBuilder sb = new StringBuilder("Hello");
  sb.append(" World");
  sb.append("!");
}

StringBuffer 클래스

  • 가변(mutable)한 문자열을 표현하고 조작하는 데 사용
  • 스레드에 안전한(thread-safe) 버전 → 동시에 여러 스레드에서 사용될 때의 동기화를 지원

참고
1. https://life-with-coding.tistory.com/416
2. https://developer-talk.tistory.com/774




📌 String str ="i"와 String str = new String("i")가 동일합니까?

A. 아니요. 동일하지 않습니다.

- String str = "i"; 경우 자열 리터럴은 문자열 풀(String Pool)에 저장되는데,동일한 문자열 리터럴을 사용하는 경우에는 이미 존재하는 객체를 재사용하게 됩니다. 즉, 동일한 문자열 리터럴을 사용하는 경우에는 동일한 객체를 참조합니다.

- String str = new String("i");는 new를 사용해서 새로운 객체를 생성합니다. 즉, 문자열 리터럴이 동일하더라도 다른 객체를 참조하게 됩니다.




📌 문자열을 반전시키는 가장 좋은 방법은 무엇인가요?

A. 2가지 방법이 있습니다.
첫 번째 방법이 배열을 직접 조작하므로 일부 상황에서 성능이 더 우수할 수 있습니다.

  1. 가장 일반적인 방법은 다음과 같이 문자열을 문자 배열로 변환하고, 배열을 역순으로 반전시킨 후 다시 문자열로 변환하는 것 입니다.
public String reverseString(String str) {
    char[] chars = str.toCharArray(); // 문자열을 문자 배열로 변환
    int left = 0;
    int right = chars.length - 1;

    while (left < right) { // 배열을 역순으로 반전
        char temp = chars[left];
        chars[left] = chars[right];
        chars[right] = temp;
        left++;
        right--;
    }

    return new String(chars); // 문자 배열을 다시 문자열로 변환하여 반환
}
  1. StringBuilder 클래스의 reverse() 메서드를 사용하여 문자열을 반전시킬 수도 있습니다.
public String reverseString(String str) {
    return new StringBuilder(str).reverse().toString();
}



📌 String 클래스의 일반적인 메서드는 무엇이 있나요?

A. 굉장히 많은데 그중 자주 사용되는 것 3개만 보자면,

  1. length(): 문자열의 길이를 반환합니다.
  2. charAt(int index): 주어진 인덱스에 해당하는 문자를 반환합니다.
  3. equals(Object obj): 다른 객체와의 문자열 내용 비교를 수행합니다.

[그 외에 많이 쓰는 메서드]

  1. length(): 문자열의 길이를 반환합니다.
  2. charAt(int index): 주어진 인덱스에 해당하는 문자를 반환합니다.
  3. substring(int beginIndex), substring(int beginIndex, int endIndex): 주어진 범위에 해당하는 부분 문자열을 반환합니다.
  4. equals(Object obj): 다른 객체와의 문자열 내용 비교를 수행합니다.
  5. equalsIgnoreCase(String anotherString): 대소문자를 무시하고 다른 문자열과의 내용 비교를 수행합니다.
  6. contains(CharSequence sequence): 주어진 문자열이 포함되어 있는지 여부를 반환합니다.
  7. startsWith(String prefix), endsWith(String suffix): 주어진 접두사 또는 접미사로 시작하는지 또는 끝나는지 여부를 반환합니다.
  8. indexOf(int ch), indexOf(String str): 주어진 문자 또는 문자열이 처음으로 등장하는 인덱스를 반환합니다.
  9. lastIndexOf(int ch), lastIndexOf(String str): 주어진 문자 또는 문자열이 마지막으로 등장하는 인덱스를 반환합니다.
  10. toUpperCase(), toLowerCase(): 문자열을 대문자 또는 소문자로 변환합니다.
  11. trim(): 문자열 앞뒤의 공백을 제거합니다.
  12. replace(CharSequence target, CharSequence replacement): 주어진 문자열 또는 문자를 다른 문자열로 대체합니다.
  13. split(String regex): 정규식을 기준으로 문자열을 분할하여 문자열 배열로 반환합니다.
  14. concat(String str): 다른 문자열을 현재 문자열에 연결합니다.
  15. isEmpty(): 문자열이 비어 있는지 여부를 반환합니다.



📌 추상 클래스에서 추상 메서드는 필수적인가요?

A. 추상 클래스에 선언된 추상 메서드는 해당 클래스를 상속하는 모든 하위 클래스에서 반드시 구현되어야 합니다. 따라서, 추상 메서드는 추상 클래스에서 필수적입니다.


추상 메소드(abstract method)

  • 식 클래스에서 반드시 오버라이딩해야만 사용할 수 있는 메소드를 의미
  • (목적) 추상 메소드가 포함된 클래스를 상속받는 자식 클래스가 반드시 추상 메소드를 구현하도록 하기 위함
  • 추상 메서드의 필수성은 추상 클래스가 어떤 동작을 가져야 하고, 해당 동작이 하위 클래스에서 구체화되어야 할 필요가 있는지에 따라 결정
abstract 반환타입 메소드이름();

추상 클래스

  • 하위 클래스에게 일부 동작을 구현할 책임을 부여하는 용도로 사용됨
  • 구현되지 않은 추상 메서드가 포함될 수 있으며, 하위 클래스는 해당 추상 메서드를 구체적으로 구현해야함
  • 하나 이상의 추상 메소드를 포함하는 클래스를 가리켜 추상 클래스/*(abstract class)라고 함
  • 인스턴스를 생성할 수 없음
/*
abstract class 클래스이름 {
    ...
    abstract 반환타입 메소드이름();
    ...
}
*/

abstract class Animal { abstract void cry(); }
class Cat extends Animal { void cry() { System.out.println("냐옹냐옹!"); } }
class Dog extends Animal { void cry() { System.out.println("멍멍!"); } }

public class Polymorphism02 {

    public static void main(String[] args) {

        // Animal a = new Animal(); // 추상 클래스는 인스턴스를 생성할 수 없음.
        Cat c = new Cat();
        Dog d = new Dog();

        c.cry();
        d.cry();

    }

}

참고 : http://www.tcpschool.com/java/java_polymorphism_abstract




📌 보통의 클래스와 추상 클래스의 차이는 무엇인가요?

A. 주요 차이점은 3가지이다.

  1. 인스턴스화 가능 여부 : 상 클래스는 직접 객체를 생성할 수 없지만, 일반적인 클래스는 직접 객체를 생성할 수 있습니다.
  2. 추상 메서드 포함 여부 : 추상 클래스는 공통 동작의 일부를 정의하고, 하위 클래스에서 구체화할 수 있습니다. 반면에, 일반적인 클래스는 모든 메서드에 구현이 있어야 합니다.
  3. 상속과 재사용 : 추상 클래스는 상속을 통해 확장되어 재사용됩니다. 일반적인 클래스도 상속을 통해 재사용할 수 있지만, 추상 클래스보다 유연성과 확장성에서는 제한적일 수 있습니다.
  4. 다중 상속 : Java에서는 클래스의 다중 상속을 허용하지 않지만, 추상 클래스는 다중 상속을 지원할 수 있습니다.

⇒ 추상 클래스는 일반적으로 구체적인 클래스의 일반화된 개념을 나타내고 공통된 동작을 정의하는 데 사용됩니다. 추상 클래스는 직접적으로 인스턴스화되지 않으며, 하위 클래스에서 상속받고 구체화됩니다. 반면에, 일반적인 클래스는 객체를 직접 생성할 수 있고, 모든 메서드에는 구현이 포함되어 있어야 합니다.




📌 final은 추상 클래스를 수정할 때 사용할 수 있나요?

A. 불가능 합니다. final을 클래스에 사용할 시에 해당 클래스는 상속할 수 없고, 확장할 수 없습니다.

추상 클래스

  • 일반적으로 상속을 통해 완전하지 않은 메서드를 가지고 있는 클래스
    → 하위 클래스는 추상 클래스를 확장하여 추상 클래스에 정의된 추상 메서드를 구현하거나 추가 동작을 수행할 수 있음


[질문 출처]
https://careerly.co.kr/comments/83898?utm_campaign=user-share

0개의 댓글

관련 채용 정보