자바

[JAVA] object 클래스

코딩하는둥이 2022. 12. 18. 17:24

java.lang 패캐지

 - 프로그래밍 시 import 하지 않아도 자동으로 import 됨

 - import java.lang.*;문장이 추가됨

 - 많이 사용하는 기본 클래스들이 속한 패키지

 - String, lnteger, System

 

Object클래스

 - 모든 클래스의 최상위 클래스 

 - java.lang.Object 클래스

 - 모든 클래스는 Object 클래스에서 상속받음

 - 모든 클래스는 Object 클래스의 메서드를 사용할 수 있음

 - 모든 클래스는 Object 클래스의 메서드 중 일부는 재정의 할 수 있음(final로 선언된 메서드는 재정의 할 수 없음)

 - 컴파일러가 extends Object를 추가함

//코드를 작성할 때
class Student{
 int studentID;
 String studentName;
}

//컴파일러가 변함
class Studnt ectends Odject{
 int StudentID;
 String studentName;

}

 

Object 클래스 메서드

메서드 설명
String toString() 객체를 문자열로 표현하여 반환합니다. 재정의하여 객체에 대한 설명이나 특정 멤버 변수 값을 반환합니다.
boolean equals(Object obj) 두 인스터스가 동일한지 여부를 반환합니다. 재정의하여 논리적으로 동일한 인스턴스임을 정의할 수 있습니다.
int hashCode() 객체의 해시코트 값을 반환합니다.
Object clone() 객체를 복제하여 동일한 멤버 변수 값을 가진 새로운 인스턴스를 생성합니다.
Class getClass() 객체의 Class 클래스를 반환합니다.
void finalize() 인스턴스가 힙 메모리에서 제거될 때 가비지 컬렉터(GC)에 의해 호출되는 매서드입니다. 네트워크 연결해 호출되는 메서드입니다. 네트워크 연결 해제, 열러 있는 파일 스트럼 해제 등을 구현합니다. 
void wait() 멀티스레드 프로그램에서 사용하는 메서드입니다. 스레드를 '기다리는 상태'(non runnable)로 만듭니다. 
void notify()  wait() 메서드에 의해 기다리고 있는 스레드(nonrunnable 상태)를 실행 가능한 상태(runnable)로 가져옵니다.

 

toString() 메서드

 - Object 클래스의 메서드 

   getClass().getName() + '@' + Integer.toHexString(hashCode())

     -> object.Book@16f65612 => 클래스이름@해시코드 값

 

- 객체의 정보를 String으로 바꾸어서 사용할 때 많이 쓰임

- String이나 Integer 클래스에서는 이미 재정의 되어 있음 

- String은 문자열 반환

- Integer는 정수 값 반환  

 

equals() 메서드

 - 두 인스턴스의 주소값을 비교하여 true/false를 반환

 - 재정의 하여 두 인스턴스가 논리적으로 동일함의 여부를 반환 

 - 같은 학번의 학생인 경우 여러 인스턴스의 주소값은 다르지만, 같은 학생으로 처리해야 학점이나 정보 산출에 문제가 생기지 않으므로 이런 경우 equals() 메서드를 재정의 함

  Student studentLss = new Student(100,"이상원");

  Student studentLee2 = studentLee; // 주소 복사

 

equals() 매서드 재정의하기

 String과 integer의 equals() 메서드

 - String은 같은 문자열의 경우 ture를 반환

 - Integer는 정수 값이 같은 경우 true를 반환

public class StrinfEquals{
 public static void main(String[] ars){
 String str1 = new String("abc");
 String str2 = new String("abc");

 System.out.pringln(str1 == str2); //두 인스턴스 주소값이 같은지 비교하여 출력
 System.out.pringln(str1.equals(str2)); // string 클래스의 equals() 메서드사용, 두인스턴스의 문자열 값이 같은지 비교하여 출력
 
 Integer i1 = new Integer(100);
 Integer i2 = new Integer(100);
 
 System.out.println(i1 == i2); // 두 인스턴스 주소 값이 같은지 비교하여 출력
  System.out.println(i1.equals(is); // Intager 클래스의 equals() 메서드 사용. 두 인스턴스의 정수 값이 같은지 비교하여 출력
 }
}

// 결과값 flase true flase true

 

hashCode()  메서드

 - hash: 정보를 저장, 검색하기 위해 사용하는 자료구조

 - 자료의 특정 값(키 값)에 대해 저장 위치를 반환해주는 해시 함수를 사용함

    index = hash(key) => 저장위치 = 해시함수(객체정보)

 - 해시 함수는 어떤 정보인가에 따라 다르게 구현됨

 - hashCode() 메서드는 인스턴스의 저장주소를 반환함

 - 힙 메모리에 인스턴스가 저장되는 방식이 hash

 - hashCode()의 반환 값: 자바 가상 머신이 저장한 인스턴스의 주소값을 10진수로 나타냄

 - 서로 다른 메모리의 두 인스턴스가 같다면?

      재정의 된 equals() 메서드의 값이 true

      동일한 hashCode() 반환값을 가져야 함

 - 논리적으로 동일함을 위해 equals() 메서드 재정의 하였다면 hashCode() 메서드로 재정의하여 동일한 값이 반환되도록 함

 - String 클래스: 동일한 문자열 인스턴스에 대해 동일한 정수가 반환됨

 - integer 클래스: 동일한 정수값의 인스턴스에 대해 같은 정수 값이 반환됨 

 

hashCode() 메서드 재정의하기

 - 같은 학생의 경우 같은 정수 값을 반환해야 하므로 학번을 반환하도록 재정의 함

 

clone() 메서드

 - 객체의 원본 복제하는 데 사용하는 메서드

 - 원본을 유지래 놓고 복사본을 사용할 때

 - 기본 틀(prototype)을 두고 복잡한 생성과정을 반복하지 않고 복제

 - clone() 메서드를 사용하면 객체의 정보(멤버변수 값)가 같은 인스턴스가 또 생성되는 것이므로 객체 지향 프로그램의 정보은닉, 객체보호의 관점에서 위배될 수 있음

 - 객체의 clone() 메서드 사용을 허용한다는 의미로 cloneable 인터페이스를 명시해 줌

class Cirecle implements Cloneable{ //  implements Cloneable: 객체를 복제해도 된다는 의미로 Cloneable 인터페이스를 함께 선언
 Point point;
 int radius;

 Circle(int x, int y, int radius){
  this.radius = radius;
  point =new Poinr(x,y);
 }
 public String to String(){
  return "원정음"+point +"이고," + "반지름은" + radius +"입니다";
 }
 
 @Override
 public Object clone() throws CloneNotSupportedException{ // throws CloneNotSupportedException: clone() 메서그를 사용할 때 발샐할 수 있는 오류를 예외 처리함
  return super.clone();
 }
}

 

String 클래스

 - String을 선언하는 두 가지 방법

    String str1 = new String("abc"); // 생성자의 매개변수로 문자열 생성

    String str2 ="test"; // 문자열 상수를 가리키는 방식

 - 힙 메모리에 인스턴스로 생성되는 경우와 상수 풀(constant pool)에 있는 주소를 참조하는 방법 두 가지

 

 

String 클래스로 문자열 연결

 - 한번 생성된 String 값(문자열)은 불변(immutable)

 - 두 개의 문자열을 연결하면 새로운 인스턴스가 생성됨

 - 문자열 연결을 계속하면 메모리 gabage 가 많이 생길 수 있음

String javaStr = new String("java");
String androidStr = new String("android");
Syrtem.out.println(javaStr);
System.out.println("처음 문자열 주소 값:" + System.identityHashCode(javaStr));

javaStr = javaStr.concat(andtoidStr); // 문자열 javaStr와 문자열 androidStr를 연결하여 javaStr 대입.

 

StringBuilder, StringBuffer 사용하기

 - 내부적으로 가변적인 char[] 배열을 가지고 있는 클래스

 - 문자열을 여러 번 연결하거나 변경할 때 사용하면 유용함

 - 매번 새로 생성하지 않고 기존 배열 변경하므로 gavage가 생기지 않음

 - StringBuffer는 멀티 쓰레드 프로그래밍에서 동기화(sybchronization)을 보장

 - 단일 쓰레드 프로그램에서는 StringBuilder를 사용하기를 권장

 - toString() 메서드로 Strinf변환

 

StringBuilder 테스트

public class StringBuilderTest {
 public statuc void main(String[] args)}
  String javaStr = new String("Java");
  System.out.println("javaStr 문자열 주소:" + System.identityHashCode(javaStr)); // System.identityHashCode(javaStr) 인스천스가 처음 생성됐을 때 메모리 주소
  
  stringBulider buffer = new StringBuilder(javaStr); // String으로부터 StringBuilder 생성
  System.out.println("연산 전 buffer 메모리 주소:" + System.identityHashCode(buffer));
 
  buffer.append("and");    // 문자열 추가
  buffer.append("android"); // 문자열 추가
  buffer.append("origramming is fun!!!"); // 문자열 추가
  System.out.println("연산후 buffer 메모리 주소: " + System.identityHashCode(buffer));
  
  javaStr = buffer.toString(); // String 클래스로 반환
  System.out.println(javaStr);
  System.out.println("연결된 javaStr 문자열주소: " + System.identityHashCode(buffer));
  
 }

}

// 결과값 : javaStr 문자열 주소:385242642    연산전 buffer 메모리 주소 : 824009085  연산 후 buffer 메모리 주소: 824009085  Java and andcoid programminf is fun!!!   새로만들어진 javastr 문자열 주소: 2085857771

 

Wrapper 클래스

 - 기본 자료형(primitive data type)에 대한 클래스 

기본형 Wrapper 클래스
boolean  Boolean
byte Byte
shar Character
short Short
int lnteger
long Long
float Float
double Double

 

오토박싱(autoboxing)과 언박싱(undoxing)

 - lnteger는 객체이고, int는 4바이트 기본 자료형임

 - 두 개의 자료를 같이 연산할 때 자동으로 변환이 일어남

Integer num1 = new Integer(100);
int num2 =200;
int sum = num + num2;  //num: num.intValue()로 변환(언박싱)
Integer num3 = num2;   // num2: lnteger.valueOf(num2)로 변환(오토박싱)

 

Class 클래스

 - 자바의 모든 클래스와 인터페이스는 컴파일 후 class 파일로 생성됨

 - class 파일에는 객체의 정보 (멤버변수, 메서드, 생성자 등)가 포함되어 있음

 - Class 클래스는 컴파일된 class 파일에서 객체의 정보를 가져올 수 있음

 

Class 클래스 오기 

 1. Object 클래스의 getClass() 메서드 사용하기

     String s = new String();

     Class c =  s.getClass();  // getClass() 메서드의 반환형은 Class

 2. 클래스 파일 이름을 Class 변수에 직접 대입하기

     Class c = String.Class;

 3.  Class.forName("클래스 이름") 메서드 사용하기 

     Class c = Class.forName("java.lang.String");

 

Class  클래스 정보 가져오기

 - reflection프로그래밍 : Calss 클래스를 이용하여 클래스의 정보(생성자, 멤버변수, 메서드)를 가져오고 이를 활용하며 인스턴스를 생성하고, 메서드를 호출하는 등의 프로그래밍 방식

 - 로컬 메모리에 객체가 없어서 객체의 데이터 타입을 직접 알 수 없는 경우(원격에 객체가 있는 경우 등) 객체 정보만을 이용하여 프로그래밍할 수 있음

 - Constructor, Method, Filed 등 java.lang.reflect 패키지에 있는 클래스들을 활용하여 프로그래밍

 - 일반적으로 자료형을 알 수 있는 경우에는 사용하지 않음  

 

Class.forName() 메서드로 동적 로딩하기 

 - 동적 로딩이란 

    :  컴파일 시에는 데이터 타입이 모두 biding 되어 자료형이 로딩되는 것 (static loding)이 아니라 실행 중에 데이터 타입을 알고 binding 되는 방식

 - 프로그래밍 할 때는 어떤 클래스를 사용할지 모를 때 변수로 처리하고 실행될 때 해당 변수에 대입된 값의 클래스가 실행될 수 있도록 Class  클래스에서 제공 static 메서드

- 실행 시에 로딩되므로 경우에 따라 다른 클래스가 사용될 수 있어 유용함

 - 컴파일 타임에 체크할 수 없으므로 해당 문자열에 대한 클래스가 없는 경우 예외(ClassNotFoundException)가 발생할 수 있음

    String className = "classex.Person"

    Class pClass = Class.forName(clasName);

'자바' 카테고리의 다른 글

[JAVA] 변수값 변경하기  (1) 2022.12.18
[JAVA] 백준 기초 문제6  (1) 2022.12.18
[JAVA] 변수값 변경  (1) 2022.12.11
[JAVA] 백준 기초문제 5  (2) 2022.12.11
[JAVA] 인터페이스  (3) 2022.12.11