쌩로그

TIL - 자바의정석 1~9장까지 흩어보기 본문

Language/JAVA

TIL - 자바의정석 1~9장까지 흩어보기

.쌩수. 2023. 8. 14. 15:06
반응형

목록

  1. 포스팅 개요
  2. 본론
  3. 요약

1. 포스팅 개요

자바의 정석을 9장까지 흩어보면서, 유용할 것 같은 부분, 그리고 잘 못 알고 있던 부분, 얻어갈 부분에 대한 포스팅입니다.

2. 본론

인터페이스와 클래스는 다르다

언젠가 인터페이스와 클래스를 헷갈려하며, 다르다고 한 포스팅이 있습니다.

바로 이 포스팅입니다.
(당시 글의 구성이나, 솜씨는 병맛이었던 점 이해부탁드립니다)

자바의정석 6~7 챕터가 객체지향 프로그래밍 내용인데, 인터페이스와 클래스에 대해서 다시 한번 봤었던 기억이 있습니다.

해당 포스팅에서 당시 GPT가 먹통이었다고 되어있어서 GPT한테 물어봤는데, 현재 제가 내린 결론은 다음과 같습니다.

인터페이스와 클래스는 다르다. 인터페이스에서 Object클래스의 메서드를 호출하면, 컴파일 에러가 발생하지 않는 것은 컴파일러 형식 추론 덕분이다. 하지만 어차피 런타임오류가 당연히 발생할 것이다.

입니다.
나중에 컴파일러의 형식추론에 대해서 알아보고싶습니다.

얇은 복사와 깊은 복사
얇은 복사와 깊은 복사를 애매하게 알고 있었는데, 개념은 다음과 같습니다.
(이용하는 메서드는 따로 적지 않았습니다.)

얇은 복사

  • 객체의 주소를 받아와서 배열을 복사하는 방법
  • 객체의 주소를 받아오기 때문에 원본의 값이 바뀌면, 복제한 값들도 바뀐다.
  • 완전한 복제가 아니기 때문에, 얇은 복사라고 한다.
  • 대체적으론 객체배열을 Object클래스의 clone()메서드를 사용할 때 다음과 같다.

깊은 복사

  • 객체의 주소가 아닌, 객체의 요소를 완전하게 복사하여, 깊은 복사라고 한다.
  • 원본이 바뀌어도 복제된 배열이 영향을 받지는 않는다.

Math 클래스의 메서드
java.util 패키지의 Math 클래스에서 (아는 것도 있지만) 유용할 것 같고, 기억하고 싶은 메서드들이 있어서 적어봅니다.

  • sqrt()/pow() : 제곱근/제곱
  • ceil()/floor() : 올림/버림
  • max() / min() : 최댓값/최솟값
  • rint() : 소수점에서 가장 가까운 2의배수를 반환
  • abs() : 절대값

래퍼클래스의 parse VS valueOf
문자열을 기본타입으로 반환하는 parse()메서드와
문자열을 래퍼클래스로 반환하는 valueOf()메서드가 있습니다.

둘의 차이를 적어보고자 합니다.

문자열을 기본형으로 변환할 때는 parse타입()을
문자열을 래퍼클래스로 변환할 때는 valueOf() 를 사용합니다.

제가 잘 못 알고 있던 것이 parse타입보다 valueOf()가 성능이 더 좋은 줄 알고있었습니다.
하지만, 그 반대였습니다. valueOf()가 성능이 조금 더 느리다고 되어있네요...ㅎㅎ;;
그래서 원래 valueOf() 메서드를 즐겨썼지만, 앞으론 parse타입() 메서드를 사용해야겠습니다.

StringTokenizer의 delim
StringTokenizer을 생성할 때 delim은(구분자) 한 문자만 적용된다고 합니다.
그걸 모르고, 두개 이상으로 이루어진 문자여로 쪼개려고 할 때가 많았습니다.

생성자가 두 가지가 있습니다.

StringTokenizer(String 문자열, delim 구분자);
StringTokenizer(String 문자열, delim 구분자, boolean returnDelims);

이렇게 되어있는데, 두번째의 returnDelims
true라면, 구분자도 Token에 포함시키고,
false라면, 구분자를 Token에 포함시키지 않는다고 합니다.

이번에 확실히 알아가네요..
그리고 다음과 같은 코드가 있다고 가정하면,

StringTokenizer("1+2=3","+=")
// "1+2=3" : 문자열
// "+=" : 구분자

이렇게 구분자가 두개의 문자열로 이뤄졌다면 어떻게 될까요?

'+'와 '=' 이 두 개의 문자가 구분자가 됩니다.

Token이 3개로 1 , 2 , 3의 요소만 가지는 것이죠
그리고 만약 세 번째의 매개변수로 true를 주면,
{ 1, +, 2, =, 3 } 이렇게 5개의 문자가 Token으로 적용됩니다.

아래에서 스샷을 확인하시면 됩니다.

Objects클래스
Objects 클래스에도 유용한 메서드들이 있었습니다.

  • isNull() : Null인지 확인
  • nonNull() : Null이 아닌지 확인
  • requireNonNull() : Null이면, NullPointerException을 Null이 아니면, 값을 반환합니다.
    • 이 메서드는 마치 Optional 클래스의 orElseThrow()와 유사한 듯합니다.

이처럼 Objects클래스에도 유용한 메서들이 있어 기억하고 싶어 정리를 한번 해봤습니다.

3. 요약

  • 인터페이스와 클래스는 다르다는 것.
  • 얇은 복사와 깊은 복사
  • Math 클래스의 메서드! (참고로 삼각함수도 있던데,, 그냥 슥~ 보고 넘겼습니다..)
  • 그리고 valueOf와 parse 메서드의 차이
  • StringTokenizer와 Objects 클래스

등 유용하겠다 싶은 걸 찾아 정리해보았습니다.

728x90

'Language > JAVA' 카테고리의 다른 글

Java - Scope  (2) 2023.12.11
자바 시간 관련 클래스는 가급적 LocalXX 타입을 사용하자  (0) 2023.07.24
람다식 - 01.  (0) 2023.05.26
자바 (Class.forName("~") feat. ReflectAPI)  (0) 2023.05.05
자바 유니코드 출력  (0) 2023.05.05
Comments