본문 바로가기
개발언어/JAVA

Java 개발을 위한 기본 API_1

by 이엘리야 2023. 9. 19.

안녕하세요.

이번 포스팅에서는 기본 API에 대해 다뤄보겠습니다.

 

자바의 주요 클래스에는 크게

Java.lang

Java.util

Java.time

Java.text

가 있으며

 

각 클래스의 구조를 그림으로 살펴보면

Java.lang의 Object부터 살펴보도록 하겠습니다.

 

Object는

최상위 클래스를 의미하며

모든 클래스의 부모클래스입니다.

 

주요 메소드로는

boolean equals(Objec obj)는

문자열을 비교하여 True, False 값을 반환해 줍니다.

 

Class getClass()는

해당 클래스를 리턴하여 주며

 

hashCode는 객체의 새시코드 값을 리턴해 줍니다.

리스트를 그대로 불러오면 패키지명@해쉬코드값

이 뜨는데 그 해쉬코드값을 의미합니다.

 

toString()은 객체를 출력할 문자열 표현을 리턴해 주며

객체를 생성하여 그 값을 출력할 때 해쉬코드값을

문자열로 표현하여 리턴해 줍니다.

 

Object에 관련하여 간단한 실습을 진행해 보도록 하겠습니다.

 ObjectTraining클래스를 만들어주세요.

그리고 toString / hashCode / getClass  실습을 위해

상단에 Student 클래스를 선언해 주도록 하겠습니다.

우선은 선언한 Student 클래스에

name과 age 변수를 선언해 주세요.

그 후 아래로 기본생성자 / 매개변수가 있는 생성자를 만들고

getter와 setter를 만들어 주세요.

후에  toString의 결과 값을 보기 위해 

우선 toString은 빼놓도록 하겠습니다.

 

잠시 여기서 체크하고 넘어가야 될 게 있는데

student 클래스에

Alt + Shift + S를 눌러보시면

이런 창이 뜨는데 여기서

override/implement Methids... 를 눌러보시면

이렇게 해당 클래스가 가지고 있는 메서드가 뜨게 되는데

Object 클래스의 메서드를 가지고 있는 것을 볼 수 있습니다.

이렇게 메소드를 오버라이딩하여 새롭게 구성하여 사용할 수 있지만

저희는 해당 메서드의 기능을 메인 메서드에서 직접 사용해 보면서

실습을 이어나가도록 하겠습니다.

 

여기까지 진행하셨다면

ObjectTraining에 메인 메서드로 오셔서

Student 클래스의 객체를 생성해 주도록 합니다.

객체를 생성하셨다면

값 비교를 위해 

 

ObjectTraining에 변수를 만들어

주도록 하겠습니다.

그 후 생성한 객체에 값을 넣기 위해

set 메서드를 작성해 줍니다.

그 후 

student 클래스의 변수 값과

ObjectTraining 클래스의 변숫값을

equals와 == 으로 비교해 보도록 하겠습니다.

우선 이 두 가지의 결괏값을 한번 보겠습니다.

여기서 두 가지를 살펴보면 

String 값은 기본적으로 참조타입 변수입니다.

그렇기에 원래대로라면 두 값은 다른 값을 가리키기에 비교했을 때

false가 나와야 하지만 equals는 참조된 레퍼런스 안의 문자열을

직접적으로 비교하기 때문에 true가 나오는 것을 알 수 있습니다.

 

밑에 Page와 student.age는 기본타입 변수로

직접 비교를 하게 되면 레퍼런스가 아닌 실제 데이터를

기준으로 비교하기 때문에 true가 나오는 것을 확인할 수 있습니다.

 

여기서 문자열을 equals가 아닌 == 으로 비교하면 어떻게 될까요?

결괏값은 true 값을 가지게 됩니다.

둘이 다른 레퍼런스 값을 가지고 있다고 생각해서

비교를 진행해 봤지만 같은 레퍼런스 값을 가지고 있다고 나오는 것을 볼 수 있는데

그 이유는

Student student = new Student();

새로운 객체를 생성하고

그 이후에 setName으로 값을 지정해 줬기 때문에

Pname = "홍길동"과 같은 주소값을 가지게 됩니다.

값은 주소값을 가지는 이유는

Pname과 student.getName 은

동일한 문자열 리터럴인 "홍길동"을 참조하고 있기 때문입니다.

 

또 다른 예를 들어보면

빈 객체를 생성하고

아래에 새로운 변수의 객체를 값을 넣어서 생성한 후

빈 객체에 set으로 값을 넣어준 상황입니다.

이 경우도 보게 되면

Student student2 = new Student("홍길동", 20);

동일한 true값을 가지는 것을 볼 수 있습니다.

그 이유는 위에서도 말씀드렸지만 동일한 문자열 리터럴을 사용하기 때문이며

문자열 리터럴 "홍길동"은 메모리에 딱 한 번만 생성되기에 이후 새로운 객체를 선언하지

않는 이상 항상 같은 주소값을 가지게 됩니다.

꼭 다른 값을 가지게 하고 싶으시다면

이렇게 빈 객체 두 개를 만들고

하나는 setName으로 값을 넣고

다른 하나는 새로운 String 객체를 생성하여 값을 지정해 주면

이렇게 false 다른 레퍼런스 값을 가진다고 반환해 주게 됩니다.

하지만 String 참조타입을 비교할 때는 equals로 비교하는 것을 권장합니다

 

다음은 HashCode와 getClass 그리고 toString을 짧게 보도록 하겠습니다.

우선 student 클래스의 HashCode와 getClass 그리고 toString 값을 보도록 하겠습니다.

위와 같이 

알 수 없는 해시코드값과

패키지. 클래스명

패키지. 클래스명@해시값

이 출력되는 것을 볼 수 있습니다.

 

해쉬코드는 해시 기반의 컬렉션
HashMap, HashSet 등 해시코드를

사용하여 데이터를 저장하고 검색하는 클래스에서 주로 사용되며

이 해시코드로 데이터가 저장되어 있는 위치를 빠르게 찾아내어

대량의 데이터를 효율적으로 처리하는 데 사용하게 됩니다.

 

두 번째로 getClass는 해당 클래스의 정보를 가져오고

동적 타입을 확인하고 싶을 때 사용합니다.

 

세 번째로 toString()을 오버라이딩하지 않고

객체 자체를 출력했을 때 나오는 현상으로

패키지. 클래스명

@ 뒤에 나오는 626b2d4a는 위에

해시 코드값 1651191114를 16진수로 표현한 값입니다.

즉 해시코드를 출력해 준 것입니다.

이제 여기서 Student 클래스에서 toString을 오버라이딩하고

결과 값을 보도록 하겠습니다.

Student class에서 Alt + Shift + S를 누르면

Generate toString()이라고 보이실 겁니다.

눌러주시면

이러한 창이 뜨는데 그대로 Generate를 눌러주세요

이렇게 오버라이딩 된 toString() 메서드를 볼 수 있습니다.

이 경우 해시코드값을 해당 문자열로 변환하여 반환해 주게 되어

결괏값은

반환된 형식으로 출력되게 됩니다.

 

 

 

 

다음은 Java.lang의

Wrapper Class입니다.

 

Wrapper 클래스는

자바 기본 데이터 타입을 객체로 정의한 클래스를 의미하며

이렇게 볼 수 있습니다.

타입 변환을 위한 메서드를 제공해 주고

각 타입 별 특별한 상수와 메서드를 제공해 줍니다.

 

Wrapper Class의 공통 메소드를 보게 되면

두 가지를 예를 들 수 있습니다.

parsOOO 은

String 타입의 문자열을 int 형 double형 등 지정한 타입으로 변환하고

toString은

int 형 double  등 특정 타입을 문자열로 변환시켜 줍니다.

간단한 예제로 보도록 하겠습니다

parseXXX는 String 타입의 값을 지정한 타입으로 변환하는 메서드이며

이렇게 예제를 보게 되면 String a 변수에 123이라는 문자열을 넣고

int b 변수에 123이라는 숫자 값을 넣었습니다.

 

그 후 비교 연산자로 값을 비교하려고 하지만

문자열과 숫자를 비교하려고 하기 때문에

위와 같이 타입이 맞지 않은 두 값을 비교하려 한다고

에러를 발생시키고 있습니다.

위 출력문을 주석처리하고

아래 출력문을 보게 되면

Integer.parseInt로 문자열을 숫자로 변환하고 있는 것을 볼 수 있습니다.

에러 또한 발생하지 않고 있기 때문에

문자열이 숫자로 변환되어 서로 비교할 수 있는 상태가 되었습니다.

결과를 보면

두 값이 같다는 true 값을 반환해 주는 것을 볼 수 있습니다.

 

이번에는 반대의 경우도 한번 살펴보도록 하겠습니다.

당연히 첫 출력문은 문자열과 숫자를 비교하려고 하기 때문에

컴파일러가 자동적으로 에러를 발생시키고 있습니다.

하지만 두 번째 출력문은 에러가 없는 것을 볼 수 있는데

첫 번째 출력문을 주석 처리하고

결과를 보도록 하겠습니다.

toString으로 문자열로 변환했지만

서로 다른 값이라고 반환해 주는 것을 볼 수 있습니다.

앞서 Object 클래스를 설명하면서 말했듯이

String은 참조타입으로서 레퍼런스 값을 가지고 있어

두 값을 == 비교 연산자로 비교 시에는 두 레퍼런스 값이 다를 경우

false가 발생한다고 말씀드렸습니다

하나의 리터럴 "999"를 가리키고 있는데 왜 false냐 하면

c에 "999"를 선언 후 

그 이후에 toString으로 숫자값을 문자값으로

변환하였기 때문에 새로운 객체를 생성하여

별도의 객체가 되게 됨으로 false를 반환하게 되는 것입니다.

이 경우 equals를 사용하여 비교하게 되면 true의 값을 반환받을 수 있습니다.

다음으로 Character는

기본 타입 char를 객체로 정의한 래퍼 클래스이며

해당 기능을 가지고 있습니다.

 

Character의 주요 메서드는 위와 같이 있습니다.

간단하게 예제를 통해 알아보겠습니다.

이렇게 소문자를 대문자로 변환하거나

조건문으로 알파벳인지 아닌지 확인하거나

대문자인지 소문자인지 확인하거나

공백인지 아닌지 숫자인지 아닌지를

boolean 값으로 파악하여

로직 구성에 도움을 줄 수 있습니다.

 

해당 래퍼 클래스는

크게 다루지 않고 넘어가고

 

다음으로 설명할 클래스는

Integer 클래스인데

Integer 클래스는

기본 타입 int를 객체로 정의한 래퍼 클래스로

앞서 사용했던 parseInt와 toString이 포함되어 있습니다.

간단한 예제의 결과만 보고 넘어가도록 하겠습니다.

이렇게 결과가 출력되게 됩니다.

 

내용이 너무 길어지게 되어

다음 포스팅에 이어서 설명하도록 하겠습니다.

 

다음 포스팅은 기본 API_2며

Math, String, StringBuffer, StringBuilder 

이렇게 4가지의 래퍼 클래스를 다뤄 보도록 하겠습니다.

 

감사합니다