티스토리 뷰

개인공부/JAVA

JAVA - CLASS

날따라해봐요요롷게 2021. 3. 16. 14:12

기본클래스

  • Object 클래스
  • String 클래스
  • Wrapper 클래스
  • Class 클래스 

 

Object 클래스

 : 클래스의 최상위 클래스 -> 모든 클래스는 Object 클래스를 상속받는다.

이는 컴파일 과정에서 상속이 일어나므로 우리가 직접 코딩하지 않는다.

모든 클래스는 Object 클래스를 상속 받아 클래스의 메소드를 사용할 수 있다.

Object 클래스의 메소드를 알아보자

 

  • String toString() : 객체를 문자열로 표현하여 반환 - 재정의하여 객체에 대한 설명이나 특정 멤버변수 값 반환
  • boolean equals() : 두 인스턴스가 동일한지 여부를 반환
  • int hashCode() : 객체의 헤시 코드 값을 반환
  • Object clone() : 객체를 복제하여 동일한 멤버 변수를 가진 새로운 인스턴스 생성
  • Class getClass() : 객체의 Class 클래스를 반환
  • void finalize() : 인스턴스가 힙 메모리에서 제거될 때 가비지 컬렉터에 의해 호출되는 메서드
  • void wait() : 멀티스레드 프로그램에서 사용하는 메서드
  • void notify() : 

Object 메서드 중에는 재정의 할 수 있는 메서드가 있고 그렇지 않은 메서드가 있다.

-toString 메서드 : 해당 메서드는 인스턴스 정보를 문자열로 반환하는 메서드이다.

메서드의 원형은 생성된 인스턴스의 클래스 이름과 주소 값을 보여준다.

package BasicClass;

class Book{
	int bookNumber;
	String bookTitle;
	
	Book(int bookNumber, String bookTitle){
		this.bookNumber = bookNumber;
		this.bookTitle = bookTitle;
	}
}

public class ToStringEx {

	public static void main(String[] args) {
		Book book1 = new Book(100, "개미");
		
		System.out.println(book1);
		System.out.println(book1.toString());
	}
}

 

결과 값 : BasicClass.Book@7852e922 / BasicClass.Book@7852e922

book1 인스턴스 정보 / toString 메서드로 인스턴스 정보

 

System.out.println 메서드에 참조변수를 넣으면 인스턴스 정보가 출력이 된다. 이 때 자동으로 toString 메서드가 호출된다. 여기서 호출되는 메서드는 Obejct 메소드이다.

 

## toString Override

package BasicClass;

class Book{
	int bookNumber;
	String bookTitle;
	
	Book(int bookNumber, String bookTitle){
		this.bookNumber = bookNumber;
		this.bookTitle = bookTitle;
	}

	@Override
	public String toString() {
		return bookTitle + "," + bookNumber;
	}
}

public class ToStringEx {

	public static void main(String[] args) {
		Book book1 = new Book(100, "개미");
		
		System.out.println(book1);
		System.out.println(book1.toString());
	}
}

위의 코드는 toString 메소드를 재정의하였다.

 

- equals() 메서드

 : 두 인스턴스의 주소값을 비교하여 boolean 값을 반환 한다. 즉, 주소값이 같다면 같은 인스턴스이다.

그런데 서로 다른 주소 값을 가지면서 같은 인스턴스라고 하기도 한다. 따라서 물리적 동일성 (인스턴스 메모리 주소 같음) 논리적 동일성 (논리적으로 두 인스턴스가 같음) 을 구현할 때 사용

 

Student studentLee = new Student("이순신");
Student studentLee2 = studentLee;

클래스를 생성하고 생성된 인스턴스를 가리키는 참조변수 studentLee 를 다른 변수 studentLee2 에 복사한다.

두 변수는 동일한 인스턴스를 가리킨다.

Student studentLee = new Student("이순신");
Student studentLee2 = studentLee;
Student studentKim = new Student("이순신");

위의 코드는 studentLee, studentLee2 가 가리키는 인스턴스와 studentKim 이 가리키는 인스턴스가 다르다. 하지만, 저장된 학생의 정보는 같다. -> 논리적으로 해당 참조변수를 모든 같게 보는것이 맞다.

 

package BasicClass;

class Student{
	int studentID;
	String studentName;
	
	public Student(int studentID, String studentName) {
		this.studentID = studentID;
		this.studentName = studentName;
	}
	public String toString(){
		return studentID + "," + studentName;
	}
}

public class EqualsTest {

	public static void main(String[] args) {
		
		Student Lee1 = new Student(101, "이순신");
		Student Lee2 = Lee1;
		Student Kim = new Student(101, "이순신");
		
		if(Lee1 == Lee2) {
			System.out.println("주소 : lee1 == lee2");
		}else {
			System.out.println("주소 : lee1 != lee2");
		}
		
		if(Lee1.equals(Lee2)) {
			System.out.println("인스턴스 : lee1 == lee2");
		} else {
			System.out.println("인스턴스 : lee1 != lee2");
		}
		
		if(Lee1 == Kim) {
			System.out.println("주소 : lee1 == Kim");
		}else {
			System.out.println("주소 : lee1 != Kim");
		}
		
		if(Lee1.equals(Kim)) {
			System.out.println("인스턴스 : lee1 == Kim");
		} else {
			System.out.println("인스턴스 : lee1 != Kim");
		}
	}
}

위의 코드는 equals 메소드가 논리적으로 물리적으로 어떻게 비교를 하는지를 알아보기 위한 코드이다.

 

Lee1 과 Lee2 는 같은 참조변수를 가리키고 있다.

그와 달리 Kim은 값은 같지만, 서로 다른 참조변수 (인스턴스 주소)를 가리키고 있다.

즉, 논리적으로는 같다. (값이 같다.) 하지만, 물리적으로는 다르다 (주소가 다르다.)

 

- hashCode 메서드

 : hash는 정보를 저장하거나 검색 할 때 사용하는 자료구조이다.

정보를 어디에 저장하고 어디서 가져오는지를 hash 함수를 사용하여 구현

public class HashCode {

	public static void main(String[] args) {
		String str1 = new String("abc");
		String str2 = new String("abc");
		
		System.out.println(str1.hashCode());
		System.out.println(str2.hashCode());
		
		Integer i1 = new Integer(100);
		Integer i2 = new Integer(100);
		
		System.out.println(i1.hashCode());
		System.out.println(i2.hashCode());
	}
}

위 코드를 살펴보면 String 클래스와 Integer 클래스의 hashcode 메서드는 재정의 되어있다.

String 클래스의 메서드는 동일한 해시코드 값을 반환하며, Integer 클래스의 메서드는 정수 값을 반환한다.

 

## clone() 메서드

 : 객체 원본을 유지해 놓고 복사본을 사용하거나, 기본 틀의 복사본을 사용해 동일한 인스턴스를 만들어 복잡한 생성 과정을 간단히 하려는 경우에 clone 메서드를 사용한다.

선언 : protected Object clone();

 

String 클래스

: 자바는 무자열을 사용할 수 있도록 String 클래스를 제공한다. 

String 을 사용할 때 - 문자열을 생성자의 매개변수로 하여 생성

                          - 이미 생성된 문자열 상수를 가리키는 방식

 

String str1 = new String("abc");
String str2 = "test";
String str3 = "test";

위의 코드를 살펴보자.

str1은 객체를 생성하여 문자열을 위한 메모리가 할당되어 새로은 객체를 생성한다.

str2는 생성자를 생성하지 않고 바로 문자열 상수를 가리키는 경우이다. 이 경우 상수의 메모리 주소를 가리키게 된다.

따라서 str2와 str3의 주소는 같다.

 

public class StringTest {

	public static void main(String[] args) {
		String javaStr = new String("java");
		String androidStr = new String("android");
		
		System.out.println("javaStr : " + javaStr);
		System.out.println("처음 문자열 주소 : " + System.identityHashCode(javaStr));
		
		javaStr = javaStr.concat(androidStr);
		System.out.println("javaStr : " + javaStr);
		System.out.println("연결된 문자열 주소 : " + System.identityHashCode(javaStr));
	}
}

위의 코드를 살펴보자.

javaStr 과 androidStr 두 개의 객체문자열을 생성했다.

concat 메서드를 이용하여 두 문자열을 연결하였다.

결과를 보면 javaandroid 로 연결되어 출력된 것 같지만, 실제로는 새로운 javaStr 문자열이 생성된 것이다.

문자열은 불변하기 때문에 변수 값이 변한게 아니고 새로운 문자열이 생성된 것이다.

 

- StringBuffer / StringBuilder 클래스

 : String 클래스는 한번 생성되면 변경되지 않는다. 따라서 String 클래스를 사용하여 문자열을 변경하거나 연결하는 프로그램을 작성하면 메모리 낭비가 일어난다. 이를 해결하기 위해 StringBuffer 와 StringBuilder 클래스를 활용한다.

 

해당 클래스는 내부에 변경 가능한 char[] 변수를 가지고 있다. 해당 클래스를 활용하여 문자열을 연결하면 배열이 확장되어 추가 메모리를 사용하지 않는다. 

 

public class StringTest {

	public static void main(String[] args) {
		String javaStr = new String("java");
		System.out.println("javaStr 문자열 주소 : " + System.identityHashCode(javaStr));
		
		StringBuilder buffer = new StringBuilder(javaStr);
		System.out.println("연산 전 buffer 메로리 주소 : " + System.identityHashCode(buffer));
		
		buffer.append(" and");
		buffer.append(" android");
		buffer.append(" programming is fun!!");
		System.out.println("연산 후 buffer 메로리 주소 : " + System.identityHashCode(buffer));
		
		javaStr = buffer.toString();
		System.out.println(javaStr);
		System.out.println("연결된 javaStr 주소 : " + System.identityHashCode(javaStr));
	}
}

위의 코드를 살펴보면, javaStr 문자열 클래스를 생성한 후 StringBuilder 클래스를 생성하여 추가 문자열을 append(추가) 한다. buffer에 들어간 문자열을 toString 메서드를 통해서 문자열로 반환하여 javaStr 문자열 클래스에 문자열을 추가한다.

 

Wrapper 클래스

 : 기본 자료형을 위한 클래스

매개변수가 객체거나 반환 값이 객체형인 경우가 있다.

이를 위해 기본 자료형처럼 사용할 수 있는 클래스를 제공한다. 

 

# Integer 클래스의 메서드

  • intValue() : Integer 캘래스 내부의 int 자로형 값을 가져오기 위해서 
  • valueOf() : 정적 메서드 사용하면 생성자를 사용하지 않고 정수나 문자열을 바로 Integer 클래스로 반환
  • parseInt() : 문자열로 전달된 경우 int 값으로 가져와서 반환
Integer iValue = new Integer(100);
int myValue = iValue.intValue();

Integer number1 = Integer.valueOf("100");
Integer number2 = Integer.valueOf(100);

int num = Integer.parseInt("100");

- intValue : 메서드를 통해서 값을 반환해서 가져옴

- valueOf : 

- parseInt : 문자열로 전달된 값을 정수로 반환

Class 클래스

  : 클래스를 사용할 때 클래스의 정보 (메서드 , 변수) 를 알고 사용을 했다.

하지만 다른 클래스를 사용할 때 반환받는 클래스가 어떤 자료형인지 모를 때도 있다.

이럴 경우 우리가 직접 해당 클래스의 정보를 찾아야한다. 이때 Class 클래스를 활용한다.

 

Class 클래스를 선언하고 클래스 정보를 가져오는 방법은 다음과 같이 세 가지가 있다.

 

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

Class c = String.Class;

Class c = Class.forName("java.lang.String");
  • Object 클래스의 getClass() 메서드 사용
  • 클래스 파일 이름을 Class 변수에 직접 대입
  • Class.forName("클래스이름") 메서드 사용

'개인공부 > JAVA' 카테고리의 다른 글

배열, 기본클래스  (0) 2021.05.05
JAVA - Inner Class, Lambda , Stream  (0) 2021.03.21
JAVA - INTERFACE  (0) 2021.03.12
JAVA - Abstract  (0) 2021.03.10
JAVA - Class 와 Object - 2  (0) 2021.03.08
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함