ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JAVA 속성 벼락치기 (3): Object, Class, String
    IT 이야기/프로그래밍 언어 2021. 9. 29. 19:01

    01. Object Class의 개념

     

    Object 클래스란 자바에 존재하는 모든 클래스들의 최상위 패키지로, 명시적으로 import하지 않아도 자동으로 import된다. String, Integer, System 등 자주 사용하는 기본 클래스들이 포함되어있는 패키지이며 우리 String이나 System을 별도로 import하지 않아도 에러가 뜨지 않는 것은 컴파일러에서 우리가 만든 클래스가 Object 클래스를 상속한다는 문구를 삽입해주기 때문이다.

     

    String 클래스에 존재하는 toString메서드 등을 오버라이딩하여 사용하는 경우가 잦다. 우리가 Object를 print하려 시도할 경우, 자바 컴파일러는 자동적으로 toString 메서드를 실행해서 객체의 정보를 문자화하여 리턴한다. 그런데 기본 이 toString메서드는 기본적으로 객체의 주소값을 문자화하여 리턴해주도록 되어있는데 인스턴스 등을 공부하는 경우가 아니라면 사실 이 주소값은 별다른 의미가 없다. 따라서 toString 메서드가 각 객체의 필드값을 리턴하도록 오버라이딩하여 사용하는 경우가 많다.

     

    toString 오버라이딩 안한상태
    이런식으로 오버라이딩 해놓고
    출력하면 이렇게 나온다.

     


    02. Object 클래스의 메소드 활용하기

     

    (1) equals

     

    참조 변수에서의 equals 메소드는 기본적으로 두 인스턴스의 주소값을 비교하여 T/F를 판단한다. 하지만 기본 타입 변수에서의 equals가 그러하듯 인스턴스 주소가 달라도 논리적으로 동일할 경우 동일한 객체로 취급해야 하는 경우가 많다. 

     

     

    특정 클래스에서 equals를 이런 식으로 재정의하여 studentId가 같을 경우 인스턴스 주소가 다르더라도 동일한 객체라는 결과를 리턴하도록 만들어줄 수 있다.

     

    (2) hashCode

     

    equals 메소드를 오버라이딩하는 경우에는 보통 hashCode 메소드도 함께 오버라이딩한다. (hashCode는 기본타입변수에서는 주소값이 아닌 value를 직접 리턴하도록 오버라이딩이 되어있다고 한다.) hashCode를 오버라이딩했지만 객체의 주소값이 필요할 경우 오버라이딩이 불가능한 System.identityHashCode 메소드를 이용하여 얻어낼 수 있다.

     

     

    (3) clone

     

     clone 메서드는 객체의 정보를 복사하는데 쓰이는 메서드이다. 그러나 아무 객체나 복제할 수 있는 것은 아니며, 클래스 자체에서 Clonable 인터페이스를 상속받은 객체만 clone이 가능하다. 

     

    코드는 인강 수업자료에서

    실행시켜보면 객체 정보를 전부 복사해놨으니 equals(오버라이딩됨)로는 true라고 나오지만 새로운 객체를 생성한 것이기 때문에 주소값은 다르다. 이 과정에서 메모리 낭비가 발생할 가능성이 있다. 따라서 String 변수를 변경해야 할 경우 처음부터 String이 아닌 Stringbuffer나 Stringbuilder 클래스로 선언하는 것이 효과적이다.

     

    Stringbuffer와 Stringbuilder는 내부적으로 가변적인 char[]변수를 지니며, 문자열이 변경될 경우 새로운 인스턴스를 생성하지 않고 기존의 char[]변수를 변경한다. 

     


    03. String, Stringbuffer, StringBuilder (가변 String)

     

    한 번 생성된 String은 immutable, 즉 변경될 수 없다. 따라서 concat메서드로 새로운 String을 연결하면 기존의 String 변수에 대상 String이 연결되는것이 아니라 새로운 String 객체가 생긴다. 

     

    단일 쓰레드 프로그램에서는 Stringbuilder를 사용하는 것이 좋지만 멀티 쓰레드 프로그래밍에서는 동기화를 보장하는 Stringbuffer를 사용하는 것이 좋다.

     

    (+) 덧붙여 Java 13부터는 Textblock이라는 기능을 제공하는데, 이는 JSON 객체 생성시 매우 유용하다. 


    04. Class 클래스를 이용한 리플렉션 프로그래밍

     

    코딩을 하다보면 빨간줄이 뜨며 ㅇㅇ 클래스에 대한 정보가 없으니 해당 클래스를 불러오라고 하는 에러 문구를 자주 보게 된다. 보통 jdk에서 해당 패키지를 불러와주면 해결되지만, 프로그래밍을 하다 보면 로컬에 없는, 즉 다른 메모리공간을 점유하고 있는 클래스를 사용해야 할 일도 가끔 발생한다. 이러한 경우에는 Class 클래스의 기능들을 이용하면 외부에 있는 클래스 정보를 불러올 수 있다. 이러한 프로그래밍 방식을 '리플렉션 프로그래밍'이라고 한다.

     

    https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html

     

    Class (Java Platform SE 8 )

    Determines if the specified Class object represents a primitive type. There are nine predefined Class objects to represent the eight primitive types and void. These are created by the Java Virtual Machine, and have the same names as the primitive types tha

    docs.oracle.com

     

    Class 클래스의 메소드들을 이용하여 클래스 정보를 동적으로 로딩할 수 있다. 동적 로딩은 데이터 타입을 컴파일시가 아닌 런타임시 바인딩하는 방식을 의미한다. 

     

     

     

    참고자료:

    https://www.javatpoint.com/

     

    Tutorials - Javatpoint

    Tutorials, Free Online Tutorials, Javatpoint provides tutorials and interview questions of all technology like java tutorial, android, java frameworks, javascript, ajax, core java, sql, python, php, c language etc. for beginners and professionals.

    www.javatpoint.com

    패스트캠퍼스 Java/Spring 마스터 초격차 패키지 [자바와 객체지향] 파트

Designed by Tistory.