본문 바로가기
코리아 IT아카데미/Java

11일차 | Object 클래스 : String활용, toString(),equal(),Layout

by Sharon kim 2021. 11. 1.
chapter03,4 복습 순서
메모
ch10>
StringTest1
StringTest2
StringBuilderTest
ch11>
ObjectTest
MainTest1
Book


chapter04
ch01>
FlowLayoutEx
BorderLayoutEx
GridLayoutEx
NoLayoutEx
ch02>
MyComponents
MainTest1

 

String 선언방식

package ch10;

public class StringTest1 {
	//main function _ start of code
	public static void main(String[] args) {
		
		//String 선언 방식
		
		//heap 메모리에 인스턴스로 생성되는 경우
		 String str1 = new String("abc");
		 
		 //data, static, constant pool에 위치한다.
		 String str2 = "abc";
		 String str3 = "abc";
		 
		 System.out.println(str1 == str2);
		 System.out.println("----------");
		 System.out.println(str2 == str3);
		 
		 String str4 = new String("abc");
		 String str5 = new String("abc");
		 
		 System.out.println("----------");
		 System.out.println(str4 == str5);
		 
		 String str6 = "abc";
		 String str7 = "abc";
		 
		 System.out.println("----------");
		 System.out.println(str6 == str7);
		 
		 //결론 : 힙 메모리는 생성될 때 마다 다른 주소값을 가지지만,
		 // 상수 풀에 생성된 문자열은 모두 같은 주소값을 가진다.(같은 문자열일 경우)
		 
	}//end of main

}//end of class

String 새 문자열 생성

package ch10;

public class StringTest2 {

	public static void main(String[] args) {
		
		//한번 생성된 string은 불변(immutable)
		// String을 연결하면 기존의 String에 연결되는 것이 아닌 새로운 문자열이 생성된다.
		String java = new String("java");
		String android = new String("Android");
		
		System.out.println(java);
		System.out.println(System.identityHashCode(java));
		System.out.println("---------------------------");
		
		//java = java + android;
		java = java.concat(android);
		System.out.println(java);//java + android
		
		System.out.println(System.identityHashCode(java));
		
		
	}//end of main

}//end of class

StringBuilder, StringBuffer

package ch10;

public class StringBuilderTest {

	public static void main(String[] args) {

		// StringBuilder, StringBuffer 활용
		// 내부적으로 가변적인 char[]를 멤버변수로 가짐.
		// 문자열을 여러번 연결하거나 변경할 때 사용하면 유용하다.
		// StringBuffer 는 멀티 스레드 프로그래밍에서 동기화를 보장 
		// 단일 스레드 프로그램에서는 StringBuilder 사용하기를 권장
		
		String java = new String("java");
		String android = new String("android");
		
		StringBuilder builder = new StringBuilder(java);
		System.out.println(builder);
		System.out.println(System.identityHashCode(builder));
		System.out.println("--------------------------------");
		
		builder.append(android);
		System.out.println(builder);
		System.out.println(System.identityHashCode(builder));
		System.out.println("--------------------------------");
		
		//문제 1 append 메서드 사용해서 3개 (주소값 확인 하기)
		builder.append("안녕하세요");
		builder.append("hi");
		builder.append("hello");
		System.out.println(builder);
		System.out.println(System.identityHashCode(builder));//주소값 확인
		System.out.println("--------------------------------");
		//문제 2 
		String tempStr = builder.toString();
		System.out.println(tempStr);
		System.out.println(System.identityHashCode(tempStr));
	}// end of main

}// end of class

 


toString()메서드

package ch11;
//많이 사용하는 기본 클래스들이 속한 패키지
import java.lang.*;

//toString() 메서드
class Student {
	
	//ToString();가 이미 정의 됨
	@Override // 재정의
	public String toString() {
		return "학생클래스";
	}
	
}//end of class Student

public class ObjectTest extends Object {
	                            //최상위 클래스, 상속을 하지 않더라도 기본적으로 가져옴
	
	String str1;
	
	public static void main(String[] args) {
		
		//System.out.println(); //만들어준적 없는데 자바가 알아서 만들어줌
		
		Student s1 = new Student();
		System.out.println(s1);
		String str1 = new String("안녕하세요");//사용 가능한 이유는 toString()이 이미 정의됨
		System.out.println(str1);
		
	}//end of main
	
}//end of class ObjectTest

equals() 메서드

package ch11;

public class MainTest1 {

	public static void main(String[] args) {
		
		Book book1 = new Book(1,"데미안","헤르만헤세");
		Book book2 = new Book(1,"데미안","헤르만헤세");
		
		System.out.println(book1 == book2);
		
		boolean result = "a".equals("a");
		System.out.println(result);
		System.out.println("a" =="a");
		System.out.println("------------------");
		
		//equals 메서드를 재정의했다. (book 클래스 안에서)
		if(book1.equals(book2)) {
			System.out.println("같은 책입니다.");
		}else {
			System.out.println("다른 책입니다.");
		}
	}

}

toString()+equals 메서드

package ch11;

public class Book {
	
	private int bookId;
	private String title;
	private String author;
	
	public Book(int bookId, String title, String author) {
		super();
		this.bookId = bookId;
		this.title = title;
		this.author = author;
	}
	//toString 메서드 재정의 해보기
	@Override
	public String toString() {
		
		return bookId + ","+ title +","+author;
		
	}
	
	//책이름 , 작가 까지 같아야  true
	@Override
	public boolean equals(Object obj) {
		
		if(obj instanceof Book) {
			Book tempBook =  (Book)obj;
			//논리적 설계
			if(this.title == tempBook.title &&
			this.bookId == tempBook.bookId &&
			this.author == tempBook.author) {
				return true;
			}else {
				return false;
			}
		}
		return false;
	}
	
	
	public static void main(String[] args) {
		Book book1 = new Book(1, "데미안 ","홍길동");
		System.out.println(book1);
		
	}//end of main
}//end if class

BorderLayout : 동서남북

package ch01;

import java.awt.BorderLayout;

import javax.swing.JButton;
import javax.swing.JFrame;

public class BorderLayoutEx extends JFrame {

	BorderLayout borderLayout;
	JButton[] buttons = new JButton[5];
	String[] title = { "북", "센터", "남", "동", "서" };
	String[] directions = {
			BorderLayout.NORTH,
			BorderLayout.CENTER,
			BorderLayout.SOUTH,
			BorderLayout.EAST,
			BorderLayout.WEST
			 };
	//directions라는 배열을 선언과 동시에 초기화
	//1. 배열 선언과 초기화 하는 방법
	
	public BorderLayoutEx() {
		initData();
		setInitLayout();
	}

	private void initData() {
		super.setTitle("BorderLayout 연습");
		super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		super.setSize(400, 400);

		borderLayout = new BorderLayout();
		for (int i = 0; i < buttons.length; i++) {
			buttons[i] = new JButton(title[i]);
			// 0 -> 북, 1 -> 센터
		}
	}

	private void setInitLayout() {
		setVisible(true);
//		super.add(buttons[0], BorderLayout.NORTH);
//		super.add(buttons[1], BorderLayout.CENTER);
//		super.add(buttons[2], BorderLayout.SOUTH);
//		super.add(buttons[3], BorderLayout.EAST);
//		super.add(buttons[4], BorderLayout.WEST);
		// for문으로 변경해주세요
		for (int i = 0; i < buttons.length; i++) {
			//add JFrame 
			add(buttons[i], directions[i]);
		}
	}

	public static void main(String[] args) {
		new BorderLayoutEx();
	}

}// end of class

GridLayout

package ch01;

import java.awt.*;//전체 가져오기
import java.awt.GridLayout;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JFrame;

public class GridLayoutEx extends JFrame{
	

	ArrayList<JButton> buttons = new ArrayList<>();
	private final int MAX_COUNT = 6;
	public GridLayoutEx() {
		initData();
		setInitLayout();
	}
	private void initData() {
		setTitle("GridLatout 연습");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(400, 400);
		for (int i = 0; i < MAX_COUNT; i++) {
			buttons.add(new JButton((i+1)+""));
		}
	}
	private void setInitLayout() {
		setVisible(true);
		setLayout(new GridLayout(2, 3));
                           //줄(rows),칸(cols)
		//JFrame에 더한다 
//		add(buttons.get(0));
//		add(buttons.get(1));
//		add(buttons.get(2));
//		add(buttons.get(3));
//		add(buttons.get(4));
		//for
		for (int i = 0; i < buttons.size(); i++) {
			add(buttons.get(i));
		}
	}
	
	public static void main(String[] args) {
		new GridLayoutEx();
	}
}//end of class

 


NoLayout

package ch01;

import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JFrame;

public class NoLayoutEx extends JFrame{
	
	ArrayList<JButton> buttons = new ArrayList<>();
	
	public NoLayoutEx() {
		initData();
		setInitLayout();
	}
	private void initData() {
		setTitle("No Layout 연습");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(500, 500);
		
		buttons.add(new JButton("1"));
		buttons.add(new JButton("2"));
		buttons.add(new JButton("3"));
		//버튼 2개 더 생성
		buttons.add(new JButton("4"));
		buttons.add(new JButton("5"));
		
	}
	private void setInitLayout() {
		
		//좌표값으로 컴포넌트 위치를 지정할 때는 
		setLayout(null);
		//버튼 사이즈 설정
		buttons.get(0).setSize(50, 50);
		buttons.get(1).setSize(150, 50);
		buttons.get(2).setSize(250, 50);
		buttons.get(3).setSize(70, 70);
		buttons.get(4).setSize(100, 100);
		
		
		buttons.get(0).setLocation(10, 10);
		buttons.get(1).setLocation(100, 100);
		buttons.get(2).setLocation(200, 200);
		buttons.get(3).setLocation(40, 20);
		buttons.get(4).setLocation(350, 250);
		
		//add
		add(buttons.get(0));
		add(buttons.get(1));
		add(buttons.get(2));
		//add 메서드 사용
		add(buttons.get(3));
		add(buttons.get(4));
		
		setVisible(true);
	}
	public static void main(String[] args) {
		new NoLayoutEx();
	}
}//end of class

MyComponents

package ch02;

import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

public class MyComponents extends JFrame{
	
	private JPanel panel;
	private JButton button;
	private JLabel label;
	JTextField textField;
	private JPasswordField jPasswordField;
	private JCheckBox checkBox;

	public MyComponents() {
		initData();
		setInitLayout();
	}
	private void initData() {
		setTitle("컴포넌트 연습");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(800, 800);
		
		panel = new JPanel();
		button = new JButton("button");
		textField = new JTextField("힌트 ", 20);
		jPasswordField = new JPasswordField(20);
		checkBox = new JCheckBox("checkBox", true);
		label =new JLabel("label");
	}
	private void setInitLayout() {
		setVisible(true);
		setLayout(new FlowLayout());
		
		add(panel);
		panel.add(button);
		panel.add(label);
		panel.add(textField);
		panel.add(jPasswordField);
		panel.add(checkBox);
	}
}

MainTest1

package ch02;

import java.util.Scanner;

public class MainTest1 {

	public static void main(String[] args) {
		MyComponents mc = new MyComponents();
		//NullPointerException -> 객체 주소를 넣지 않았거나
		System.out.println("글자를 입력하세요");
		Scanner scanner = new Scanner(System.in);
		String userInput = scanner.nextLine();
		
//		System.out.println(userInput);
		
		mc.textField.setText(userInput);
	}

}

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

java.lang 패키지

  • 프로그래밍 시 import 하지 않아도 자동으로 import됨
  • import.java.lang.*;
  • 많이 사용하는 기본 클래스들이 속한 패키지
  • String, System...

모든 클래스는 object 클래스를 상속 받는다.

  • java.lang.Object 클래스
  • 모든 클래스의 최상위 클래스는 
  • 모든 클래스는 Object에서 상속 받고, Object 클래스의 메서드 중 일부는 재정의해서 사용할 수 있음
  • 컴파일러가 extends Object를 추가함
  • class Student =>class Student extends Object

toString() 메서드

  • 객체의 정보를 String으로 바꿔서 사용할 때 쓰임
  • 많이 사용하는 String은 이미 재정의 되어 있음
  • toString()메서드 재정의 예
class Book{
	private String title;
    private String author;
    
    public Book(String title, String author){
    	this.title = title;
        this.author = author;
    }
    
   public String toString(){
   		return title + "," + author;
   }
}//end of class

public class BookTest{
	
    public static void main(String[] args) {
	
    Book book = new Book("데미안", "헤르만헤세");
    System.out.println(book);
    
    }
}

equals() 메서드

  • 두 인스턴스의 주소 값을 비교하여 true/false를 반환
  • 재정의 하여 두 인스턴스가 논리적으로 동일함의 여부를 구현함
  • 인스턴스가 다르더라도 논리적으로 동일한 경우 true를 반환하도록 재정의 할 수있음 (같은 학번, 같은 사번, 같은 아이디의 회원...)
    class Book {
    	private int bookId;
    	private String title;
    	private String author;
    
    	public Book(int id, String title, String author) {
    		this.bookId = id;
    		this.title = title;
    		this.author = author;
    	}
    
    	// toString 메서드 재정의
    	@Override
    	public String toString() {
    		return bookId + "," + title + "," + author;
    	}
    
    	// equals 메서드 재정의
    	@Override
    	public boolean equals(Object obj) {
    		if (obj instanceof Book) { // --> true 이면 if 안에 로직 실행
    			Book tempBook = (Book) obj;
    			if (this.title == tempBook.title && this.author == tempBook.author) {
    				return true;
    			} else {
    				return false;
    			}
    		}
    		return false;
    	}
    }​