Java Review (5)

지환·2023년 9월 27일
0

JAVA

목록 보기
13/39
post-thumbnail

오버라이딩

package com.Overriding;

//모든 클래스는 Object클래스를 상속받고 있어서 
//부모가 가진 메소드를 호출 할 수 있고, 재정의(메소드 오버라이딩) 할 수 있다.

// 메소드 오버로딩
// 메소드 오버라이딩(단 상속관계인지 따진다.)
public class Car extends Object{
	
	int speed = 20;
	String carColor = "red";
	@Override
	public String toString()
	{
		return "자식의 차는"+ speed + "차 색깔은"+ carColor+ "이다.";
	}

	public static void main(String[] args) {

		Car car = new Car();
		System.out.println(car);
		System.out.println(car.toString());
		// Car 클래스에서는 toString() 메소드를 정의하지 않았지만, 부모가 정의하고 있는 메소드라서 나는 호출 할 수 있다.
		
	}

}
------------------------------------------------------------------------
자식의 차는20차 색깔은red이다.
자식의 차는20차 색깔은red이다.
  • 메소드 호출 시 리턴타입이 있는 메소드라면 왼쪽에 대입연산자를 사용할 수 있다.
Random r = new Random();
int s = r.nextInt(10); 

- nextInt가 리턴타입이 존재함.
- int로 받는다.

생성자

  • 생성자 안에서 메소드 및 변수를 선언 할 수 있다.

Test case 1

package com.Overriding;

import javax.swing.JFrame;

public class JFrameTest1 extends JFrame {
	
	public JFrameTest1()
	{
		System.out.println("디폴트 생성자");
		initDisplay();
		methodA();
	}
	public JFrameTest1(String name)
	{
		System.out.println("string name 실행");
		initDisplay();
		methodA();
	}
	
	//사용자메소드 정의하기
	public void initDisplay()
	{
		System.out.println("initDisplay 호출");
		this.setSize(500,400);
		this.setVisible(true);
// 내 안에 선언된 메소드가 아니다.
// 내(JFrame Test1) 안에 선언된 메소드(setSize(int,int)가 아니다. 그럼 어디에?JFrame
// this는 자바가 제공하는 수정자이고 보통 자기자신을 가르킬 때 사용한다. 
// 주로 전변과 지변에 이름이 같은 경우 구분 하기 위해 사용한다.
		
	}
	
	public void methodA()
	{
		System.out.println("methodA() 호출");
	}

	public static void main(String[] args) {
		

		new JFrameTest1();
		System.out.println("===============================");
		new JFrameTest1("지환");
		
	
		
	}

} 
// 생성자 안에서 인스턴스 없이도 사용 할 수 있다.


-----------------------------------------------------
디폴트 생성자
initDisplay 호출
methodA() 호출
===============================
string name 실행
initDisplay 호출
methodA() 호출
  • 생성자 안에서는 static이 없어서 인스턴스 변수 없이도 사용 가능함.
	public JFrameTest1()
	{
		System.out.println("디폴트 생성자");
		initDisplay();
		methodA();
	}
  • 변수 이름이 없으면 지역변수로 선언되어 참조되는 클래스를 다른 메소드에서 재사용이 불가능하다.

잘못된 예시 -> 하나의 인스턴스로 통일해야함

package com.Overriding;

import javax.swing.JFrame;

public class JFrameTest1 extends JFrame {
	
	public JFrameTest1()
	{
		System.out.println("디폴트 생성자");
		initDisplay();
		methodA();
	}
	public JFrameTest1(String name)
	{
		System.out.println("string name 실행");
		initDisplay();
		methodA();
	}
	
	//사용자메소드 정의하기
	public void initDisplay()
	{
		System.out.println("initDisplay 호출");
		this.setSize(500,400);
		this.setVisible(true);
// 내 안에 선언된 메소드가 아니다.
// 내(JFrame Test1) 안에 선언된 메소드(setSize(int,int)가 아니다. 그럼 어디에?JFrame
// this는 자바가 제공하는 수정자이고 보통 자기자신을 가르킬 때 사용한다. 
// 주로 전변과 지변에 이름이 같은 경우 구분 하기 위해 사용한다.
		
	}
	
	public void methodA()
	{
		System.out.println("methodA() 호출");
	}

	public static void main(String[] args) {
		

		new JFrameTest1();
		new JFrameTest1().methodA(); 
		// 화면이 두개열린다. -> initDisplay 메소드가 2번 호출되니깐 + 문제부분 

		
	}

} 
// 생성자 안에서 인스턴스 없이도 사용 할 수 있다.

  • 클래스 타입을 파라미터로 받는다.
	public void methodA(JFrameTest1 jft)
	{
		System.out.println("methodA() 호출");
	}
package com.Overriding;

import javax.swing.JFrame;

public class JFrameTest1 extends JFrame {
	
	public JFrameTest1()
	{
		System.out.println("디폴트 생성자");
		initDisplay();
		methodA();
	}
	public JFrameTest1(String name)
	{
		System.out.println("string name 실행");

	}
	
	//사용자메소드 정의하기
	public void initDisplay()
	{
		System.out.println("initDisplay 호출");
		this.setSize(500,400);
		this.setVisible(true);
// 내 안에 선언된 메소드가 아니다.
// 내(JFrame Test1) 안에 선언된 메소드(setSize(int,int)가 아니다. 그럼 어디에?JFrame
// this는 자바가 제공하는 수정자이고 보통 자기자신을 가르킬 때 사용한다. 
// 주로 전변과 지변에 이름이 같은 경우 구분 하기 위해 사용한다.
		
	}
	
	public void methodA()
	{
		System.out.println("methodA() 호출");
	}
	
	public void methodB()
	{
		System.out.println("methodB() 호출");
	}

	public static void main(String[] args) {
		

		new JFrameTest1();
		System.out.println("=====================");
		new JFrameTest1("jihwan").methodB();
		// 화면이 두개열린다. -> initDisplay 메소드가 2번 호출되니깐
		
		
	
		
	}

} 
// 생성자 안에서 인스턴스 없이도 사용 할 수 있다.
new JFrameTest1("지환").methodB(); 

-----------------------------------
string name 실행 --> 생성자 호출 
methodB() 호출

Test case 2 + public static JFrameTest1

package com.Overriding;

import javax.swing.JFrame;

public class JFrameTest1 extends JFrame {
	
	public static JFrameTest1 jft = new JFrameTest1();
	
	public JFrameTest1()
	{
		System.out.println("디폴트 생성자");
		initDisplay();
	}
	public JFrameTest1(String name)
	{
		System.out.println("string name 실행");

	}
	
	//사용자메소드 정의하기
	public void initDisplay()
	{
		System.out.println("initDisplay 호출");
		this.setSize(500,400);
		this.setVisible(true);
// 내 안에 선언된 메소드가 아니다.
// 내(JFrame Test1) 안에 선언된 메소드(setSize(int,int)가 아니다. 그럼 어디에?JFrame
// this는 자바가 제공하는 수정자이고 보통 자기자신을 가르킬 때 사용한다. 
// 주로 전변과 지변에 이름이 같은 경우 구분 하기 위해 사용한다.
		
		
	}
	
	public void methodA(JFrameTest1  jft)
	{
		System.out.println(jft);
		System.out.println("methodA() 호출");
	}
	
	public void methodB()
	{
		System.out.println("methodB() 호출");
	}

	public static void main(String[] args) {
		
//// main 내부에서 인스턴스화를 하면 지변의 성격이 된다.
//		jft.methodA(jft); //메소드 파라미터 자리가 원시형 타입인 경우 + 메소드 파라미터 자리가 참조형 타입인 경우 + 갯수
//		System.out.println(jft); // 지변이지만 메소드 호출 시 파라미터를 통해서  원본을 넘길 수 있다.
//		
//		System.out.println("=====================");
//		new JFrameTest1("jihwan").methodB(); 
//		// 화면이 두개열린다. -> initDisplay 메소드가 2번 호출되니깐
		
		
		
		
	
		
	}

} 
// 생성자 안에서 인스턴스 없이도 사용 할 수 있다.

new JFrameTest1("jihwan").methodB(); 
-main-
new JFrameTest1("jihwan")
-main-

	public JFrameTest1(String name)
	{
		System.out.println("string name 실행");
		methodB();
	}

같은 의미이다.

Test Case3

package com.Overriding;

import javax.swing.JFrame;

public class JFrameTest1 extends JFrame {
	
	
	public JFrameTest1()
	{
		System.out.println("디폴트 생성자");
		initDisplay();
	}
	public JFrameTest1(String name)
	{
		System.out.println("string name 실행");

	}
	
	//사용자메소드 정의하기
	public void initDisplay()
	{
		System.out.println("initDisplay 호출");
		this.setSize(500,400);
		this.setVisible(true);
// 내 안에 선언된 메소드가 아니다.
// 내(JFrame Test1) 안에 선언된 메소드(setSize(int,int)가 아니다. 그럼 어디에?JFrame
// this는 자바가 제공하는 수정자이고 보통 자기자신을 가르킬 때 사용한다. 
// 주로 전변과 지변에 이름이 같은 경우 구분 하기 위해 사용한다.
		
		
	}
	
	public void methodA(JFrameTest1  jft)
	{
		System.out.println(jft);
		System.out.println("methodA() 호출");
	}
	
	public void methodB()
	{
		System.out.println("methodB() 호출");
	}

	public static void main(String[] args) {
		
//// main 내부에서 인스턴스화를 하면 지변의 성격이 된다.
		JFrameTest1 jft = new JFrameTest1();
		jft.methodA(jft); //메소드 파라미터 자리가 원시형 타입인 경우 + 메소드 파라미터 자리가 참조형 타입인 경우 + 갯수
		System.out.println(jft); // 지변이지만 메소드 호출 시 파라미터를 통해서  원본을 넘길 수 있다.
		
		System.out.println("=====================");
		new JFrameTest1("jihwan").methodB(); 
//		// 화면이 두개열린다. -> initDisplay 메소드가 2번 호출되니깐
		
		
		
		
	
		
	}

} 
// 생성자 안에서 인스턴스 없이도 사용 할 수 있다.

+ 심화버전

package com.Overriding; // 학습 목표 : 메소드를 활용해서 나는 인스턴스화를 할 수 있다.

import java.util.Scanner;

public class AddressBook {
	AddressBook abook = null;
	
	
	// 2. 메소드를 활용해 인스턴스
	public AddressBook getObject()
	{
		if(abook == null) // 객체를 생성하기전에 null 체크를 먼저(선처리)를 해서 
		{
			abook = new AddressBook();
		}

		return abook;
	}
	
	// 3. 메소드 안에서 조건에 따라 인스턴스화를 다르게 가져갈 수도 있다. 0 다른 선택지가 생김

	public static void main(String[] args) {

		// 인스턴스 방법에는 여러가지가 있다.
		//1,기본 방법
		AddressBook abook = new AddressBook();

	}

}

주소록 만들기

AddressBook - 1단계

package com.JFrame;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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


//ActionListener는 인터페이스이라서 추상메소드를 가지고 있다.
// 추상메소드란 선언만 되어있고, (); 선언해야함 
public class AddressBook implements ActionListener{
	
	// 선언부
	// 이벤트처리 3단계 
	/*
	 * 1. 버튼의 이벤트를 지원하는 인터페이스를  implements한다. 현재는 ActionListener 사용한다.
	 * 2. 해당 인터페이스가 선언하고 있는 메소드를 오버라이딩해야한다. - actionPerformed(ActionEvent e)
	 * 3. 이벤트 소스와 이벤트처리를 담당하는 클래스를 매칭해야 반환
	 */
	JFrame jf = new JFrame();
	JPanel jp_north = new JPanel();
	JButton btnSelect = new JButton("조회");
	JButton btnInsert = new JButton("입력");
	JButton btnUpdate = new JButton("수정");
	JButton btnDelete = new JButton("삭제");


	// 생성자
	public AddressBook()
	{
		
	}
	
	public void initDisplay()
	{
		btnSelect.addActionListener(this);
		btnInsert.addActionListener(this);
		btnUpdate.addActionListener(this);
		btnDelete.addActionListener(this);

		
		jp_north.add(btnSelect);
		jp_north.add(btnInsert);
		jp_north.add(btnUpdate);
		jp_north.add(btnDelete);
		jf.add("North", jp_north);
		jf.setTitle("주소록");
		jf.setSize(800,500);
		jf.setVisible(true);
	}
	
	
	// 화면처리
	
	
	// 메인메소드
	
	
	public static void main(String[] args) {

		AddressBook abook = new AddressBook();
		abook.initDisplay();
		
		
	}

	//해당부분은 선언만 되어있고 구현이 안 되어있음 --> 추상클래스의 추상 메소드이다.
	
	@Override 
	public void actionPerformed(ActionEvent e) {
	String command = e.getActionCommand();
	System.out.println(command);
	
	}

}

AddressDialog - 1단계

package com.JFrame;

import javax.swing.JDialog;

public class AddressDialog {

	//선언부
	JDialog jdg_address = new JDialog();
	
	//화면처리부
	public void initDisplay()
	{
		jdg_address.setTitle("조회|입력|수정"); // 메소드 설계, 파라미터 결정한다.
		jdg_address.setSize(400,500);
		jdg_address.setVisible(true);
		
	}
	
	//메인메소드
	
	public static void main(String[] args) {
		
		AddressDialog ad = new AddressDialog();
		ad.initDisplay();
		
	}
	
	
}

콘솔

조회
입력
수정
삭제

Q1) 현재 코드에서 actionPerformed메소드를 호출하는 코드는 어디에도 없다. 그런데 System.out.println(command)가 실행된다. 어떻게 실행되는 걸까요?

--> actionPerformed메소드는 마치 main메소드처럼 버튼이 눌려지고 눌려졌다는 사실을 JVM이 감지하면, 그때 자동으로 호출되는 메소드이다. -->Call Back Method

Equals 추가 공부분


package com.JFrame;

public class Equals {

	public static void main(String[] args) {
		String s1 = "안녕하세요";
		String s2 = "잘가세요";
		String s3 = new String("안녕하세요");
		String s4 = new String("잘가세요");

		
		// 글자를 비교 [equals "값" ]자체를 비교 
		System.out.println(s1 == s2); // 같은 방향을 가르킨다.
		System.out.println(s1 == s3); // s3은 새로운 객체를 생성 
		System.out.println(s1.equals(s3));
		System.out.println(s3.equals(s4)); 

		

		
		

	}

}

String 추가 공부분

package com.JFrame;

public class StringExam {

	public static void main(String[] args) {

		String s1 = "";
		String s2 = null;
		System.out.println(s1);
		System.out.println(s2);
		System.out.println(s1.equals(s2));
		System.out.println("".toString());
		//System.out.println(s2.equals(s1));
	}

}

---------------------------
[공백]
null
false

콜백 메소드 공부하기

profile
아는만큼보인다.

0개의 댓글