스터디/혼공학습단

[혼공학습단] 혼공자 9기 3주차

Jop 2023. 1. 24. 21:59
반응형

안녕하세요 벌써 스터디를 시작한지 절반이 넘어갔네요ㅠ

스터디를 하면서 자바의 개념을 다시 익히고 기초가 탄탄해지니 

자신감이 붙는거 같네요 그럼 3주차도 화이팅 해보겠습니다~!

 

 📄 혼공자 3주차 미션 (진도 Chapter 10 ~ 11)

기본 미션 : 혼공 용어 노트에 용어 추가 등 노트 활용하고 공유하기

선택 미션 : P.512 문제 8번 풀고 풀이 과정 설명하기

혼자 공부하는 자바 미션

 

 📄 기본미션 (혼공 용어 노트에 용어 추가 등 노트 활용하고 공유하기)

저는 저번기수에서도 혼공 용어 노트라는 말을 듣고 당황했던게 ebook으로 구매해서 노트가 따로 없었어요ㅠ

아무래도 서적을 구매하는 분 한해서 받는 것 같았어요...

그래도 한빛미디어에서 PDF파일도 올려주셨어요! 아래 링크 보면 다운 받으실 수 있습니다!

 

https://hongong.hanbit.co.kr/wp-content/uploads/2019/06/%ED%95%9C%EB%B9%9B%EB%AF%B8%EB%94%94%EC%96%B4_%ED%98%BC%EA%B3%B5%EC%9E%90_%EC%9A%A9%EC%96%B4%EC%A7%91.pdf

 

저는 보통 혼공 용어 노트를 복습용으로 많이 사용합니다. 노트는 키워드를 요점정리를 해놨기 때문에 해당 키워드를 보고 어떤 내용이 있었는지 리마인드 할 수 있기 때문에 복습할때 같이 이용하는 것도 추천 드릴게요!

012345678
혼공 용어집 활용

 

 📄 선택미션 (p.512 문제 8번 풀고 풀이 과정 설명하기)

문제. 박싱된 Integer 객체를 == 연산자로 비교했습니다. 100을 박싱한 Integer 객체는 true가 나오는데, 300을 박싱한 Integer 객체는 false가 나오는 이유를 설명해보세요.

public class IntegerCompareExample{
	public static void main(String[] args){
    	Integer obj1 = 100;
        Integer obj2 = 100;
        Integer obj3 = 300;
        Integer obj4 = 300;
        
        System.out.println( obj1 == obj2 );
        System.out.println( obj3 == obj4 );
    }
}

정답 : true, false

이유

int 값의 범위( ~128 ~ 127 )안에 있을 경우에는 동등 비교 연산자(==,!=) 로 값 비교가 가능하지만 벗어났을 경우에는 equals()메소드를 사용해야합니다.

위의 obj1,obj2는 int 값의 범위 안에 있으므로  캐싱해둔 객체를 참조하여 비교하기 때문에 true가 return 됩니다.

반면, obj3,obj4는 값의 범위를 벗어났으므로 각각 새로운 객체를 생성하기 때문에 false가 return 됩니다.

 

현재 생성자로 Integer생성하는 것은 지양하고 있습니다.

이 생성자를 사용하는 것은 거의 적절하지 않습니다. 정적 팩토리 valueOf(int)는 일반적으로 훨씬 나은 공간 및 시간 성능을 제공할 가능성이 있으므로 더 나은 선택입니다.

현재 생성자를 통해서 Integer를 생성하는 것은 java9이후로 Deprecated되어 있습니다. 

java9 이후부터는 valueOf()의 사용을 권장하는데, valueOf(int)를 보면 위와 같은 현상을 이해할 수 있습니다.

여기서, IntegerCache.low = -128; IntegerCache.high = 127;

만약 새로운 인스턴스가 필요하지 않다면 이 함수는 일반적으로 Integer 생성자 보다 우선적으로 사용되어야 합니다. 이 메소드는 자주 요청되는 값들을 캐싱하는 방법은 메모리 공간과 시간 적으로 상당한 결과를 얻을 가능성이 높습니다. 

자주 요청되는 값들은 (-128~127) 캐싱을 해두기 때문에 캐싱해둔 객체를 참조하고 그 이외의 값들은 객체를 생성하게 됩니다.

 

 

 📄 내용정리

Chapter10 예외처리

예외처리

프로그램에서 예외가 발생했을 경우 프로그램의 갑작스러운 종료를 막고, 정상 실행을 유지할 수 있도록 처리하는 것을 말합니다.

 

try-catch-finally 블록

생성자 내부와 메소드 내부에서 작성되어 일반 예외와 실행 예외가 발생할 경우 예외처리를 할 수 있도록 해줍니다.

 

다중 catch 블록

catch 블록이 여러 개라 할지라도 단 하나의 catch 블록만 실행됩니다. 그 이유는 try 블록에서 동시다발적으로 예외가 발생하지 않고, 하나의 예외가 발생하면 즉시 실행을 멉추고 해당 catch 블록으로 이동하기 때문입니다.

 

throws 키워드

메소드 선언부 끝에 작성되어 메소드에서 처리하지 않은 예외를 호출한 곳으로 떠넘기는 역할을 합니다. throws 키워드 뒤에는 떠넘길 예외 클래스를 쉼표로 구분해서 나열해주면 됩니다.

 

Chapter11 기본 API 클래스

java.lang 패키지

클래스 용도
Object - 자바 클래스의 최상위 클래스로 사용
System - 표준 입력 장치(키보드)로부터 데이터를 입력받을 때 사용
- 표준 출력 장치(모니터)로 출력하기 위해 사용
- 자바 가상 기계를 종료할 때 사용
- 쓰레기 수집기를 실행 요청할 때 사용
Class - 클래스를 메모리로 로딩할 때 사용
String - 문자열을 저장하고 여러 가지 정보를 얻을 때 사용
Wrapper (Character,Integer,Long etc..) - 기본 타입의 데이터를 갖는 객체를 만들 때 사용
- 문자열을 기본 타입으로 변환할 때 사용
- 입력값 검사에 사용
Math - 수학 함수를 이용할 때 사용

 

자바 API 문서

- 자바8 문서 링크

https://docs.oracle.com/javase/8/docs/api/

 

Java Platform SE 8

 

docs.oracle.com

- 자바11 문서 링크

https://docs.oracle.com/en/java/javase/11/docs/api/

 

Overview (Java SE 11 & JDK 11 )

This document is divided into two sections: Java SE The Java Platform, Standard Edition (Java SE) APIs define the core Java platform for general-purpose computing. These APIs are in modules whose names start with java. JDK The Java Development Kit (JDK) AP

docs.oracle.com

책에서 API 문서 읽는 설명은 String을 사용합니다. 위치 링크 첨부 해드리겠습니다.

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/String.html

 

String (Java SE 11 & JDK 11 )

Compares two strings lexicographically. The comparison is based on the Unicode value of each character in the strings. The character sequence represented by this String object is compared lexicographically to the character sequence represented by the argum

docs.oracle.com

* 아래 설명은 java11 docs 기준으로 정리했습니다.

1번 위치 : 최상단의 SUMMARY

SUMMARY는 클래스 내에 선언된 멤버가 무엇이 있는지 알려줍니다. 링크가 있으면 해당 멤버가 있다는 뜻이고 없을 경우 해당 멤버가 없다는 뜻입니다. String 클래스는 NESTED에 링크가 없으므로 중첩 클래스나 중첩 인터페이스가 없다는 뜻 입니다. 반면에 FIELD, CONSTR, METHOD는 모두 링크가 있으므로 public 또는 protected로 선언된 필드, 생성자, 메소드는 있다는 뜻 입니다.

 

2번 위치 : 빨간색 블록의 클래스 선언부를 봅니다. 클래스가 final 또는 abstract 키워드가 있는지 확인합니다. String 클래스는 final키워드가 있으므로 부모 클래스로는 사용할 수 없습니다. 

그리고 String 클래스는 Object를 상속받고 있습니다. 상속관계 있는 모든 클래스를 볼려면 2번의 상속 계층도를 보면 됩니다.

마지막으로 implements 키워드 뒤에 언급된 인터페이스가 무엇인지 봅니다. String 클래스는 Serializable, Comparable<String>, CharSequence와 같이 3개의 인터페이스를 구현하고 있습니다.

 

Field Summary

Field Summary

Field클래스의 summary에서 Modifier and Type 컬럼에는 static 또는 protected 여부와 타입이 표시됩니다. 

 

Constructor Summary

String클래스에서 선언된 생성자 목록은 총 10개가 있습니다.

매개 변수의 타입 또는 개수를 달리해서 10개가 넘는 생성자 들이 오버로딩되어 있습니다.

 

Method Summary

Modifier and Type 칼럼에는 static 또는 protected 여부와 리턴 타입이 표시됩니다. static이 없다면 인스턴스 메소드이고, protected가 없다면 기본이 public입니다.

 

Object method

- 객체 비교(equals())

public boolean equals(Object obj) { ... }

두 객체를 비교해서 논리적으로 동등하면 true를 리턴하고, 그렇지 않으면 false를 리턴합니다. 논리적으로 동등하다는 것은 같은 객체이건 다른 객체이건 상관없이 객체가 저장하고 있는 데이터가 동일함을 뜻합니다.

예를들어 String 객체의 equals() 메소드는 String 객체의 번지를 비교하는 것이 아니고, 문자열이 동일한지 조사해서 같다면 true를 리턴하고, 그렇지 않다면 false를 리턴합니다.

 

클래스, 객체의 값으로 동등비교

public class Member{
	public String id;
    
    public Member(String id){
    	this.id = id;
    }
    // id값은 unique
    @Override
    public boolean equals(Object obj){
    	if(obj instanceof Member){  //매개값이 Member 타입인지 확인
        	/**
            * Member 타입으로 강제 타입 변환하고 id필드값이 동일한지 검사한 후, 
            * 동일하다면 true 리턴
            **/
        	Member member = (Member) obj;
            if(id.equals(member.id)) {
            	return true;
            }
        }
        // 매개값이 Member 타입이 아니거나 id필드 값이 다른 경우 false를 리턴
        return false;
    }
}

 

- 객체 해시코드(hashCode())

객체를 식별하는 하나의 정수값

객체의 메모리 번지를 이용해서 해시코드를 만들어 리턴하기 때문에 객체마다 다른 값을 가지고 있습니다. 논리적 동등 비교시 hashCode()를 오버라이딩할 필요가 있는데 HashSet,HashMap,Hashtable은 다음과 같은 방법으로 두 객체가 동등한지 비교합니다.

 

클래스, 객체의 값으로 동등비교 hashCode() 재정의 하지 않음

public class Key{
	public int number;
    
    public Key(int number){
    	this.number = number;
    }
    
    @Override
    public boolean equals(Object obj){
    	if(obj instanceof Key) {
        	Key compareKey = (Key) obj;
            if(this.number == compareKey.number){
            	return true;
            }
        }
        return false;
   }
}

 

위의 경우 HashMap의 식별키로 Key 객체를 사용하면 저장된 값을 찾아오지 못합니다. number의 필드 값이 같더라도 hashCode()메소드에서 리턴하는 해시코드가 다르므로 다른 식별키로 인식하기 때문입니다.

 

hashCode() 메소드 재정의 추가

public class Key{
	public int number;
    
    public Key(int number){
    	this.number = number;
    }
    
    @Override
    public boolean equals(Object obj){
    	if(obj instanceof Key) {
        	Key compareKey = (Key) obj;
            if(this.number == compareKey.number){
            	return true;
            }
        }
        return false;
   }
   
   @Override
   public int hashCode() {
   	return number;
   }
}

해시코드의 return값이 같고, equals()의 리턴값이 true가 되기 때문에 동등한 객체로 평가 됩니다.

 

- 객체 문자 정보(toString())

객체의 문자 정보(객체를 문자열로 표현한 값)를 리턴

기본적으로 Object 클래스의 toString() 메소드는 '클래스이름@16진수해시코드'로 구성된 문자 정보를 리턴합니다.

 

String 클래스

// 배열 전체를 String 객체로 생성
String str = new String(byte[] bytes);
// 지정한 문자셋으로 디코딩
String str = new String(byte[] bytes, String charsetName);

// 배열의 offset 인덱스 위치부터 length만큼 String 객체로 생성
String str = new String(byte[] bytes, int offset, int length);
// 지정한 문자셋으로 디코딩
String str = new String(byte[] bytes,int offset,int length, String charsetName)

 

String 메소드

리턴 타입 메소드 이름(매개 변수) 설명
char chatAt(int index) 특정 위치의 문자를 리턴합니다.
boolean equals(Object anObject) 두 문자열을 비교합니다.
byte[] getBytes() byte[]로 리턴합니다.
byte[] getBytes(Charset charset) 주어진 문자셋으로 인코딩한 byte[]로 리턴합니다.
int indexOf(String str) 문자열 내에서 주어진 문자열 위치를 리턴합니다.
int length() 총 문자의 수를 리턴합니다.
String replace(CharSequence target, CharSequence replacement) target 부분을 replacement로 대치한 새로운 문자열을 리턴합니다.
String substring(int beginIndex) beginIndex 위치에서 끝까지 잘라낸 새로운 문자열을 리턴합니다.
String substring(int beginIndex,int endIndex) beginIndex 위치에서 endIndex 전까지 잘라낸 새로운 문자열을 리턴합니다.
String toLowerCase() 알파벳 소문자로 변환한 새로운 문자열을 리턴합니다.
String toUpperCase() 알파벳 대문자로 변환한 새로운 문자열을 리턴합니다.
String trim() 앞뒤 공백을 제거한 새로운 문자열을 리턴합니다.
String valueOf(int i)
valueOf(double d)
기본 타입 값을 문자열로 리턴합니다.

 

CharSequence?

CharSequence는 클래스가 아니라 인터페이스이다.
인터페이스명(character + sequence)에서 짐작되듯이 char 값을 읽을 수 있는 시퀀스이다. 그리고 이 인터페이스는 다양한 종류의 char 시퀀스에 대해 균일한 읽기 전용 접근 권한을 제공한다. CharSequence를 implements 하여 구현된 대표적인 클래스로는 String, SpannableStringBuilder, StringBuilder, StringBuffer 등이 있다.

 

https://dudmy.net/android/2017/09/15/difference-char-string/

 

CharSequence와 String의 차이 (feat. StringSpannableBuilder) - Dudmy's Devprint

String? String은 하나의 클래스이다. Java 프로그램의 모든 문자열 리터럴은 이 클래스의 인스턴스로 구현된다. 중요한 점은 문자열 값은 작성된 후에 변경할 수 없다는 것이다. String 객체에 보관하

dudmy.net

 

- 박싱(Boxing)과 언박싱(Unboxing)

기본 타입의 값을 포장 객체로 만드는 과정을 박싱, 반대로 포장 객체에서 기본 타입의 값을 얻어내는 과정을 언박싱이라고 합니다.

 

박싱하는법

1. 생성자

ex) Integer int = new Integer("100");

2. valueOf() (포장클래스마다 존재함)

ex) Integer obj = Integer.valueOf("100");

 

언박싱하는법

포장클래스마다 존재함. '기본타입이름'+Value()

int num = obj.intValue();

 

포장값 비교

타입 값의 범위
boolean true, false
char \u0000 ~ \u007f
byte, short, int -128 ~ 127

위의 표 값처럼 값이 범위 안에 포함되어 있으면 ==와 !=연산자로 비교할 수 있지만 그 이외의 경우에는 언박싱한 값을 얻어서 비교해야합니다. 만약 포장값이 값의 범위안에 있다면 캐싱해둔 객체를 참조하고, 값의 범위를 벗어났을 경우에는 새로운 객체를 생성하게 됩니다.

 

Calendar 클래스

Calendar 클래스는 추상(abstract)클래스 이므로 new 연산자를 사용해서 인스턴스를 사용할 수 없습니다.

Calendar클래스의 정적 메소드인 getInstance() 메소드를 이용하면 현재 운영체제에 설정되어 있는 시간대를 기준으로 한 Calendar하위 객체를 얻을 수 있습니다.

Calendar now = Calendar.getInstance();

Calendar 객체를 얻었다면 get()메소드를 이용해서 날짜와 시간에 대한 정보를 읽을 수 있습니다.

int year = now.get(Calendar.YEAR);
int month = now.get(Calendar.MONTH)+1;
int day = now.get(Calendar.DAY_OF_MONTH);

 

이번 3주차과제에서는

java API 문서를 읽는 방법에 대해서 배울수 있었습니다.

예전에는 문서의 의미를 파악하지 못해서 필요한 부분만 읽고 넘어가는 부분이 대다수였는데, 

이번 공부를 통해서 API문서를 심도있게 파악할 수 있는 계기가 되어서 좋았던 것 같습니다 👍👍👍

또한 wrapper클래스를 공부하면서 생성자를 통해 wrapper클래스를 사용하는 것이 deprecated가 되었다는 것을 알고 있었지만,

어떤 이유에서 deprecated되었는지 내부로직은 어떻게 동작하는지 추가로 알게되었습니다.

 

기존에 알던 내용도 새로운 책을 통해서 공부하게 되거나 복습하면서 다시 일깨울수 있는 점이 좋은 것 같습니다.

아직 3주차가 남았으니 마지막까지 화이팅 해보겠습니다.

다음 4주차과제때 찾아뵙겠습니다

감사합니다.

반응형