[Java & SpringBoot로 시작하는 웹 프로그래밍] 4주차 학습 - 1 (Object , String, Wrapper 클래스)

진문장·2021년 9월 11일

Object , String, Wrapper 클래스

Object 클래스란?

  • 모든 클래스의 최상위 클래스
  • java.lang.Object 클래스
  • 모든 클래스는 Object 클래스에서 상속 받음
  • 모든 클래스는 Object 클래스의 메서드를 사용할 수 있음
  • 모든 클래스는 Object 클래스의 일부 메서드를 재정의 하여 사용할 수 있음

toString() 메서드

  • toString() 메서드의 원형
getClass().getName() + '@' + Integer.toHexString(hashCode())
  • 객체의 정보를 String으로 바꾸어 사용할 때 유용함
  • 자바 클래스중에는 이미 정의된 클래스가 많음
    EX) String,Integer,Calender 등
  • 많은 클래스에서 재정의하여 사용

equals() 메서드

  • 두 객체의 동일함을 논리적으로 재정의 할 수 있음
  • 물리적 동일함: 같은 주소를 가지는 객체
  • 논리적 동일함: 같은 학번의 학생, 같은 주문 번호의 주문
  • 물리적으로 다른 메모리에 위치한 객체라도 논리적으로 동일함을 구현하기 위해 사용하는 메서드

equals() 메서드 예시

Student student1 = new Student(100,"진문장");
Student student2 = student1;
Student student3 = enw Student(100,"진문장");
  • student 1 과 student2 은 같은가?
    • 물리적: 둘은 동일하다 왜냐하면 student1의 물리적 주소를 student2가 참조하기 때문에 물리적으로 동일한 상태이다.
    • 논리적: 동일한 객체를 참조하기때문에 논리적으로 동일하다.
  • student1 과 studnet3 는 같은가?
    • 물리적: 둘은 JVM 힙 메모리 영역에서 각자 다른 주소를 가지고 있기 때문에 동일하지 않다.
    • 논리적: 둘의 id 와 name이 동일하기 때문에 논리적으로는 같다. 그럼으로 equals 메소드를 구현하여 논리적 동일하다는 것을 알려줘야한다.
/* equals 메서드 구현 */
@Override
public boolean equals(Object obj) {
  if( obj instanceof Student) {
    Student s = (Student)obj;
    if ( this.id == s.getId() && this.name.equals(s.getName()) ){
       return true;
     }
  }
   return false;
}

hashCode() 메서드

  • 모든 객체들은 생성될 때 hashCode가 지정됨
  • hahsCode() 메서드의 반환 값: 인스턴스가 저장된 가상머신의 주소를 10진수로 반환
  • 두개의 서로 다른 메모리에 위치한 인스턴스가 동일하다는 것은?
    • 논리적으로 동일: equals()의 반환값이 true
    • 동일한 hashCode 값을 가짐: hashCode()의 반환 값이 동일

cloone() 메서드

  • 객체의 복사본을 만듦
  • 기본 틀으로 부터 같은 속성 값을 가진 객체의 복사본을 생성할 수 있음
  • 객체지향 프로그래밍의 정보은닉에 위배되는 가능성이 있으므로 복제할 객체는 cleneable 인터페이스를 명시해야 함

String 클래스

  • String 클래스 선언하기
String str1 = new String("abc"); // 인스턴스로 생성됨
String str2 = "abc"; // 상수풀에 있는 문자열을 가리킴

String immutable

  • 한번 선언되거나 생성된 문자열을 변경할 수 없음
  • String 클래스의 concat() 메서드 혹은 "+"를 이용하여 String을 연결하는 경우 문자열은 새로 생성 됨
String str1 = "hello";
String str2 = "world";
String str3 = str1 + str2; // "helloworld"

StringBuilder 와 StringBuffer

  • 가변적인 char[]배열을 멤버변수로 가지고 있는 클래스
  • 문자열을 변경하거나 연결하는 경우 사용하면 편리한 클래스
  • StringBuffer는 멀티쓰레드프로그래밍에서 동기화(Synchronization)이 보장됨
  • 단일 쓰레드 프로그래밍에서는 StringBuilder를 사용하는 것이 더 좋음
  • toString() 메서드로 String 반환

Wrapper 클래스

기본 타입의 데이터를 객체로 취급해야 할 경우 기본타입을 객체로 감싼 Wrapper 클래스를 사용

primitive typeWrapper Class
booleanBoolean
byeByte
charCharacter
shortShort
intInteger
longLong
floatFloat
doubleDouble

Class 클래스

  • 자바의 모든 클래스와 인터페이스는 컴파일 후 class 파일로 생성됨
  • class 파일에는 객체의 정보 (멤버변수, 메서드, 생성자등) 가 포함되어 있음
  • Class 클래스는 컴파일된 class 파일에서 객체의 정보를 가져올 수 있음

Class 클래스 가져오기

// 1
String s = new String();
Class c = s.getClass();

// 2
Class c = String.Class;

// 3
Class c = Class.forName("java.lang.String"); // 동적 로딩

reflection 프로그래밍

  • Class 클래스로 부터 객체의 정보를 가져와 프로그래밍 하는 방식
  • 로컬에 객체가 없고 자료형을 알 수 없는 경우 유용한 프로그래밍
  • java.lang.reflect 패키지에 있는 클래스 활용

newInstance() 메서드

  • Class 클래스 메서드
  • new 키워드를 사용하지 않고 인스터스를 생성
  • 9 버전 이후에는 deprecated 되어 사용 비추천

forName() 메서드와 동적 로딩

  • Class 클래스 static 메서드
  • 동적 로딩 이란?
    • 컴파일 시에 데이터 타입이 모두 binding 되어 자료형이 로딩되는 것이 아니라 실행 중에 데이터 타입을 알고 binding 되는 방식
    • 실행 시에 로딩되므로 경우에 따라 다른 클래스가 사용될 수 있어 유용함
    • 컴파일 타임에 체크 할 수 없으므로 해당 문자열에 대한 클래스가 없는 경우 예외가 발생할 수 있음

0개의 댓글