본문 바로가기

Java

[Chapter 10] Object클래스

  • java.lang

- 자바 프로그램에서 가장 많이 사용하는 패키지

- import 하지 않아도 자동으로 포함됨

 

 

01. Object 클래스


  • Object 클래스란?

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

- 명시적으로 extends java.lang.Object하지 않아도 자동으로 상속받게 된다

 

  • Object 클래스

- toString( ): 객체의 정보를 문자열로 반환

- equals( )

  • == : 참조변수값 비교
  • equals( ) : 정의한 값 비교

- hashCode( )

- getClass.getName( )

 

  • 복제

- 객체 복제 : 원본 객체의 값과 동일한 값을 가진 새로운 객체를 생성하는 것 (단순복제? 완전히 동일한 객체)

- 얕은 복제 : 단순히 필드 값을 복사하는 방식으로 객체를 복제하는 것 

- Cloneable 인터페이스를 구현하여 clone 메서드를 사용 가능하게 해야 한다

            - clone( )사용할거면 implements Cloneable해줘야 함

 

- 깊은 복제: 참조하고 있는 객체도 복사하는 것

            - Cloneable 인터페이스를 구현한 후, clone 메서드를 오버라이드 하여 내부의 참조 객체도 복제해야 한다

 

 

객체가 분리된 것은 맞는데 참조필드가 같은 객체를 가르키고 있다 --> 얕은 복제

이 상황을 모면하기 위해서 clone( ) 메소드를 새로 오버라이드 해줘야한다 --> 깊은 복제

 

(예시)

package com.javaex.api.objectclass.v4;

// v3. 얕은 복제
// 객체의 필드데이터를 단순 복제하는 것
// Cloneable 인터페이스 구현
public class Point implements Cloneable {
	private int x;
	private int y;
	
	public Point(int x, int y) {
		this.x = x;
		this.y = y;
	}
	public Point getClone() {
		//복제본
		Point clone = null;
		try {
			clone = (Point)clone();
		}catch(CloneNotSupportedException e) {
			//복제 실패
			e.printStackTrace();
		}
		return clone;
	}

	@Override
	public String toString() {
		// 객체 문자열 포맷을 반환
		return String.format("Point(%d, %d)", x, y);
	}

	@Override
	public boolean equals(Object obj) {
		if (obj instanceof Point) {
			//변환
			Point other = (Point)obj;
			return x == other.x && y == other.y;
		}
		return super.equals(obj);
	}

	public int getX() {
		return x;
	}

	public void setX(int x) {
		this.x = x;
	}

	public int getY() {
		return y;
	}

	public void setY(int y) {
		this.y = y;
	}
	
	
}

 

package com.javaex.api.objectclass.v4;

import java.util.Arrays;

//v4. 깊은 복제
public class Scoreboard implements Cloneable{
	//참조 타입 필드
	private int[] scores;
	
	//생성자
	public Scoreboard(int[] scores) {
		this.scores = scores;
	}
	
	public Scoreboard getClone() {
		Scoreboard clone = null;
		
		try {
			clone = (Scoreboard)clone();
		}catch(CloneNotSupportedException e) {
			e.printStackTrace();
		}
		
		return clone;
	}

	@Override
	protected Object clone() throws CloneNotSupportedException {
		//1. 얕은 복제를 시도
		Scoreboard clone = (Scoreboard)super.clone(); //object가 가지고 있었던 clone()쓰기
		//2. 내부 참조 객체를 복제
		clone.scores = Arrays.copyOf(scores, scores.length);// scores를 length만큼 복사해주고
		
		return clone;
	}

	public int[] getScores() {
		return scores;
	}

	public void setScores(int[] scores) {
		this.scores = scores;
	}

	@Override
	public String toString() {
		return "Scoreboard [scores=" + Arrays.toString(scores) + "]";
	}
	
	
	
}
package com.javaex.api.objectclass.v4;

public class LangClassTest {

	public static void main(String[] args) {
		Scoreboard s1 = new Scoreboard(new int[] {10,20,30,40});
		System.out.println("s1 = "+ s1);
		
		Scoreboard s2 = s1.getClone();
		System.out.println("s2 = "+ s2);
		
		System.out.println("s1 == s2 ? "+ (s1 == s2));
		
		s2.getScores()[2] = 100;
		System.out.println("s1 = "+ s1);
		System.out.println("s2 = "+ s2);
		
		System.out.println("s1.scores == s2.scores ? "+ (s1.getScores() == s2.getScores()));//s1의 주소값과 s2의 주소값 비교
	}

}

 

02. String Class


  • 문자(Character)

- 기본 자료형 (char) : 부호가 없는 2바이트 정수

- 문자 선언 char letter; 

- 문자 할당 letter = ‘A’; 

- 문자 사용 System.out.println(letter); System.out.println((int)letter);

 

 

  • 문자열(String) 클래스

- 연속된 문자 (character)들을 저장하고 다루기 위한 클래스 

- 문자열 상수: “”로 둘러싸인 문자열 -> 한번 만들어진 String 객체는 변경 불가 (immutable) 

- 문자열 선언 String greeting;

- 문자열 할당 greeting = “Hello Java!”;

- 문자열 사용 System.out.println(greetin);

- 특수 문자의 표현 (Escape characters)

  • “+” 연산자 : 문자열의 연결. 문자열과 다른 타입의 연결은 문자열로 변환되어 연결

 

  • index

- String 객체 내의 문자 인덱싱은 배열과 같이 0부터 시작됨 

- charAt(position) : 해당 위지의 문자를 반환 

- Substring(start, end) : start부터 end까지의 문자들을 새로운 문자열로 반환

 

  •   String Class 메소드들

 

(예시)

		//유용한 메서드들
		String str ="Java Programming JavaScript Programming";
		System.out.println("str:"+ str);
		System.out.println("LENGTH:"+ str.length());
		
		// 변환 메서드
		System.out.println("UPPER:"+ str.toUpperCase());
		System.out.println("LOWER:"+ str.toLowerCase());
		
		//검색 메서드
		System.out.println("인덱스 5의 글자:"+ str.charAt(5));
		int index = str.indexOf("Java");	//Java의 인덱스
		System.out.println("1번째 Java 인덱스:"+ index);
		index = str.indexOf("Java", 5);	//5번 인덱스 이후의 Java
		System.out.println("2번째 Java 인덱스:"+ index);
		index = str.indexOf("Java", 21);	//21번 인덱스 이후의 Java
		System.out.println("3번째 Java 인덱스:"+ index);// 찾을 수 없는 검색은 -1이다
		
		System.out.println("마지막 Java 인덱스 "+ str.lastIndexOf("Java"));
		
		//문자열 추출
		System.out.println("substring(5): "+ str.substring(5));
		System.out.println("substring(5, 16):"+ str.substring(5, 16)); // 5~ 16 앞까지
		
		// 문자열 변경
		System.out.println("replace:"+ str.replace("Programming", "Coding"));
		
		// 문자열은 변경되지 않음(immutable)
		System.out.println("str:"+ str);
		
		//화이트 스페이스 제거
		String s2 = "            Hello      ";
		String s3 = "        Java         ";
		
		System.out.println(s2.trim() + " " + s3.trim());
		
		//문자열 분리
		String[] words = str.split(" ");
		for (String word: words) {
			System.out.println("WORD:" + word);
		}
		
		// 문자열의 비교: Unicode 비교
		// 0: 순서가 같다
		// 음수: 순서가 빠르다
		// 양수: 순서가 늦다
		System.out.println("ABC".compareTo("ABD"));

 

 

03. String Buffer 클래스


  • String Buffer 클래스

- 가변 크기의 버퍼를 가짐

- String이 immutable 인 것에 비해, StringBuffer 객체는 수정이 가능함

 

  • StringBuffer 와 StringBuilder의 차이점

StringBuffer -> thread - safe (동기화 ㅇ)

StringBuilder -> thread - not safe (동기화 x)

 

(예시)

		// 버퍼의 생성
		StringBuffer sb = new StringBuffer("This");
		System.out.println(sb);
		// 문자열 추가: append
		sb.append(" is pencil");
		System.out.println(sb);
		// 문자열 삽입: insert
		sb.insert(7, " my");
		System.out.println(sb);
		// 문자열 치환: replace
		sb.replace(7, 10, " your");
		System.out.println(sb);
		//버퍼 사이즈 조정: setLength
		sb.setLength(5);
		System.out.println(sb);
		
		StringBuffer sb2 = new StringBuffer("This")
				.append(" is pencil")
				.insert(7, " my")
				.replace(7,  10, " your");
		String s = sb2.toString();
		System.out.println(s);

 

'Java' 카테고리의 다른 글

[회원 정보 입력하기]  (0) 2022.01.04
[JAVA]Date와 SimpleDateFormat으로 간단하게 시간 표시하기  (0) 2022.01.03
[Chapter08]객체지향 프로그래밍2  (0) 2021.12.14
[chapter04] 제어문  (0) 2021.12.10
[chapter 05 ] 배열  (0) 2021.12.09