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로 받는다.
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() 호출
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() 호출
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();
}
같은 의미이다.
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();
}
}
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);
}
}
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
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));
}
}
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