package ch03;

import java.awt.Graphics;

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

/**
 * 
 * @author GGG 학습목표 내부클래스 외부클래스
 */
//외부클래스
public class MyFrame1 extends JFrame {

	MyDrawPanel drawPanel; // 맴버 변수 선언

	// 내부클래스 선언 - inner class
	// 내부 클래스에는 - 정적 클래스 , 인스턴스 클래스
	// 정적클래스란 :static <-- (new 하지 않더라고 접금 가능) 클래스 접근가능
	// 인스턴스클래스란 : 외부클래스가 new, 내부클래스 new 되어야한다
	class MyDrawPanel extends JPanel {

		// paints -->X
		// print -->X
		@Override
		public void paint(Graphics g) {
			super.paint(g);
			g.drawRect(100, 100, 100, 200);
			g.drawRect(100, 50, 50, 50);
			g.drawString("반가워", 300, 300);
			g.drawLine(250, 300, 500, 550);
			g.drawOval(300, 300, 50, 50);
		}
	}

	public MyFrame1() {
		initDate();
		setInitLayout();
	}

	private void initDate() {
		setTitle("외부클래스란");
		setSize(600, 600);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		drawPanel = new MyDrawPanel();
	}

	private void setInitLayout() {
		add(drawPanel);
		setVisible(true);
	}

}// end class

//클래스화 상속의 예
package ch03;

public class MainTest1 {

	// 내부클래스 사용

	public static void main(String[] args) {
		// 외부파일에서 MyDrawPanel사용할일이없고
		// MyFrame1 에서만 사용하는 녀석이라면 내부 클래스에서 설계할수있다.
		new MyFrame1();
	}

}

'자바' 카테고리의 다른 글

GUI를 이용한 이미지 출력 연습(Swing)  (1) 2023.02.21
외부 클래스를 이용한 집만들기!  (1) 2023.02.21
Swing 을 이용한 GUI  (0) 2023.02.21
GUI 프로그램  (0) 2023.02.20
Object 클래스  (0) 2023.02.20
package ch01;

import java.awt.BorderLayout;

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

public class BorderLayoutEx1 extends JFrame {
	// BorderLayout <-- 컴포먼트를 동서남북 센터로

	JButton buttons1 = new JButton("동");
	JButton buttons2 = new JButton("서");
	JButton buttons3 = new JButton("남");
	JButton buttons4 = new JButton("북");
	JButton buttons5 = new JButton("선터");

	public BorderLayoutEx1() {
		initData();
		setinitLayout();
	}

	private void initData() {
		setTitle("borderlayout 연습");
		setSize(600, 600);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

	private void setinitLayout() {
		// setLayout();
		// borderlaout 은 매게변수 값 하나를 더 추가할수 있다(방향지정가능)
		add(buttons1, BorderLayout.EAST);
		add(buttons2, BorderLayout.WEST);
		add(buttons3, BorderLayout.SOUTH);
		add(buttons4, BorderLayout.NORTH);
		add(buttons5, BorderLayout.CENTER);

		setVisible(true);
	}

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

}

package ch01;

import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;

public class BorderLayoutEx2 extends JFrame {
	// BorderLayout <-- 컴포먼트를 동서남북 센터로
	JButton[] buttons = new JButton[5];
	String[] direction = { BorderLayout.EAST, BorderLayout.WEST, BorderLayout.SOUTH, 
                                              BorderLayout.NORTH,BorderLayout.CENTER };

//	JButton buttons1 = new JButton("동");
//	JButton buttons2 = new JButton("서");
//	JButton buttons3 = new JButton("남");
//	JButton buttons4 = new JButton("북");
//	JButton buttons5 = new JButton("선터");

	public BorderLayoutEx2() {
		initData();
		setinitLayout();
	}

	private void initData() {
		setTitle("borderlayout 연습");
		setSize(600, 600);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		for (int i = 0; i < buttons.length; i++) {
			buttons[i] = new JButton(direction[i]);
		}
	}

	private void setinitLayout() {
		// setLayout();
		// borderlaout 은 매게변수 값 하나를 더 추가할수 있다(방향지정가능)
		for (int i = 0; i < buttons.length; i++) {
			add(buttons[i], direction[i]);
		}
		setVisible(true);
	}

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

}

package ch01;

import java.awt.FlowLayout;

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

//배치관리자 연습 - FlowLaout
//components 수평, 수직 으로 배치해주는 녀석
public class FlowLayoutEx extends JFrame {

	private JButton button1;
	private JButton button2;
	private JButton button3;
	// 문제1 버튼 6개를 만들어 화면 출력
	private JButton button4;
	private JButton button5;
	private JButton button6;

	public FlowLayoutEx() {
		// 초기화 값 세팅(메서드를 통해서 역할 분담) 순서도 중요하다
		initData();// 데이터
		setInitLayout();
	}

	public void initData() {
		setTitle("FlowLayout 연습");
		setSize(500, 500);
		setVisible(true);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		button1 = new JButton("button1");
		button2 = new JButton("button2");
		button3 = new JButton("button3");
		button4 = new JButton("button4");
		button5 = new JButton("button5");
		button6 = new JButton("button6");
	}

	public void setInitLayout() {
		// 배치관리자를 설정해보자.
		// FlowLayout
		setLayout(new FlowLayout(FlowLayout.LEFT, 10, 200));
		add(button1);
		add(button2);
		add(button3);
		add(button4);
		add(button5);
		add(button6);
	}

	// 코드테스드
	public static void main(String[] args) {
		new FlowLayoutEx();
	}

}

package ch01;

import java.awt.FlowLayout;

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

public class FlowLayoutEx3 extends JFrame {

	// 배열
	// 8개생성
	private JButton[] button = new JButton[8];

	public FlowLayoutEx3() {
		initData();
		setInitLayout();
	}

	private void initData() {
		setTitle("FlowLayoutEx3");
		setSize(600, 600);
		setVisible(true);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		for (int i = 0; i < button.length; i++) {
			button[i] = new JButton("button" + (i + 1));
		}
	}

	private void setInitLayout() {
		setLayout(new FlowLayout(FlowLayout.CENTER, 10, 10));
		for (int i = 0; i < button.length; i++) {
			add(button[i]);
		}
	}

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

package ch01;

import java.awt.FlowLayout;

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

public class FlowLayoutEx4 extends JFrame {

	// 맴버변수 선언 할게요
	private JButton[] buttons = new JButton[5];

	// 생성자는 메모리에 올라갈 떄 처음 실행 되는 코드
	// 구현부 안에서 순서도 중요하다
	public FlowLayoutEx4() {
		initData();
		setInitLayout();
	}

	private void initData() {
		setTitle("배열 활용");
		setSize(600, 600);
		// static 변수나 함수는 클래스 이름으로도 접근 가능
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		for (int i = 0; i < buttons.length; i++) {
			buttons[i] = new JButton("button" + (i + 1));
		}
	}

	private void setInitLayout() {

		setLayout(new FlowLayout(FlowLayout.LEFT, 30, 30));
		for (int i = 0; i < buttons.length; i++) {
				add(buttons[i]);
		}
		setVisible(true);
	}
	public static void main(String[] args) {
		new FlowLayoutEx4();
	}
}

package ch01;

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

//좌표기반으로 컴포먼트들을 배치해보자
public class NoLayoutEx1 extends JFrame {

	private JButton button1;
	private JButton button2;
	private JButton button3;

	private NoLayoutEx1() {
		initData();
		setinitLayout();
	}

	private void initData() {
		setTitle("좌표기반 연습");
		setSize(1_000, 1_000);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		button1 = new JButton("1");
		button1.setSize(100, 100);
		button2 = new JButton("2");
		button2.setSize(150, 50);
		button3 = new JButton("3");
		button3.setSize(200, 30);
	}

	private void setinitLayout() {
		setLayout(null);
		// 좌표기반으로 셋팅하면 각 컴포넌트에 크기를 지정해 주어야 한다 기본 값 0
		button1.setLocation(100, 100);
		add(button1);
		button2.setLocation(200, 150);
		add(button2);
		button3.setLocation(400, 200);
		add(button3);
		setVisible(true);
	}

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

}

 

package ch01;

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

public class NoLayoutEx2 extends JFrame {

	JButton[] buttons = new JButton[10];

	public NoLayoutEx2() {
		initData();
		setInitLayout();
	}

	private void initData() {
		setTitle("혼자해보는 레이아웃없는 좌표형식");
		setSize(1_000, 1_000);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		buttons[0] = new JButton("버튼1");
		buttons[0].setSize(100, 100);
		buttons[1] = new JButton("버튼2");
		buttons[1].setSize(100, 100);
		buttons[2] = new JButton("버튼3");
		buttons[2].setSize(100, 100);
		buttons[3] = new JButton("버튼4");
		buttons[3].setSize(100, 100);
		buttons[4] = new JButton("버튼5");
		buttons[4].setSize(100, 100);
		buttons[5] = new JButton("버튼6");
		buttons[5].setSize(100, 100);
		buttons[6] = new JButton("버튼7");
		buttons[6].setSize(100, 100);
		buttons[7] = new JButton("버튼8");
		buttons[7].setSize(100, 100);
		buttons[8] = new JButton("버튼9");
		buttons[8].setSize(100, 100);
		buttons[9] = new JButton("버튼9");
		buttons[9].setSize(100, 100);
	}

	private void setInitLayout() {
		setLayout(null);
		buttons[0].setLocation(0, 0);
		add(buttons[0]);
		buttons[1].setLocation(100, 100);
		add(buttons[1]);
		buttons[2].setLocation(200, 0);
		add(buttons[2]);
		buttons[3].setLocation(300, 100);
		add(buttons[3]);
		buttons[4].setLocation(400, 0);
		add(buttons[4]);
		buttons[5].setLocation(500, 100);
		add(buttons[5]);
		buttons[6].setLocation(600, 0);
		add(buttons[6]);
		buttons[7].setLocation(700, 100);
		add(buttons[7]);
		buttons[8].setLocation(800, 0);
		add(buttons[8]);
		buttons[9].setLocation(900, 100);
		add(buttons[9]);
		setVisible(true);
	}

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

컴포먼트 확인 기본

package ch02;

import java.awt.Checkbox;
import java.awt.FlowLayout;

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

public class MyComponents extends JFrame {
	private JButton button1;
	private JLabel lable;// 글자를 넣어서 화면에 띄울수 있다
	private JTextField textField;// 사용자한테 입력값을 받을수 있는 컴포먼트
	private JPasswordField jPasswordField;// 사용자 비번을 받는 컴포먼트
	private JCheckBox jCheckBox;//

	public MyComponents() {
		initData();
		setIntiLayout();
	}

	private void initData() {
		setTitle("컴포먼트 확인");
		setSize(800, 800);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		button1 = new JButton("Jbutton");
		lable = new JLabel("글자를 적는 컴포먼트");
		textField = new JTextField("아이디 입력", 20);
		jPasswordField = new JPasswordField("비번입력", 10);
		jCheckBox = new JCheckBox("동의 하시겠습니까");
	}

	private void setIntiLayout() {
		add(button1);
		add(lable);
		add(textField);
		add(jPasswordField);
		add(jCheckBox);
		setLayout(new FlowLayout());
		setVisible(true);
	}

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

패널 추가연습

package ch02;

import java.awt.BorderLayout;
import java.awt.Color;

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

public class MyFramePanel extends JFrame {

	private JButton button1;
	private JButton button2;
	// 패널 : 컴포먼트들을 그룹화 시킬수 있닥 즉 가가에 배치관리자를 지정하수있다
	private JPanel panel1;
	private JPanel panel2;

	public MyFramePanel() {
		initDate();
		setIntiLayout();
	}

	private void initDate() {
		setTitle("패널 추가 연습");
		setSize(600, 400);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		panel1 = new JPanel();
		panel1.setBackground(Color.red);
		panel2 = new JPanel();
		panel2.setBackground(Color.yellow);

		// 버튼 초기화
		button1 = new JButton("버튼1");
		button2 = new JButton("버튼2");

	}

	private void setIntiLayout() {
		add(panel1, BorderLayout.CENTER);
		add(panel2, BorderLayout.SOUTH);
		// 루트패널 기본레이아웃은 borderLayout 였는데
		// 하지만 추가적으로 만들어 사용하는 Panel 은 기본 레이아웃이 FLowLayout이다.

		panel1.add(button1);
		// panel1.setLayout(null);

		panel2.add(button2);

		setVisible(true);
	}

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

package ch02;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;

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

public class MyFramePanel2 extends JFrame {

	private JButton button1;
	private JButton button2;
	private JButton button3;
	private JButton button4;
	private JButton button5;
	private JButton button6;
	// 패널 : 컴포먼트들을 그룹화 시킬수 있닥 즉 가가에 배치관리자를 지정하수있다
	private JPanel panel1;
	private JPanel panel2;

	public MyFramePanel2() {
		initDate();
		setIntiLayout();
	}

	private void initDate() {
		setTitle("패널 추가 연습");
		setSize(600, 400);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		panel1 = new JPanel();
		panel1.setBackground(Color.red);
		panel2 = new JPanel();
		panel2.setBackground(Color.yellow);

		// 버튼 초기화
		button1 = new JButton("버튼1");
		button2 = new JButton("버튼2");
		button3 = new JButton("버튼3");
		button4 = new JButton("버튼4");
		button5 = new JButton("버튼5");
		button6 = new JButton("버튼6");

	}

	private void setIntiLayout() {
		add(panel1, BorderLayout.CENTER);
		add(panel2, BorderLayout.SOUTH);
		// 루트패널 기본레이아웃은 borderLayout 였는데
		// 하지만 추가적으로 만들어 사용하는 Panel 은 기본 레이아웃이 FLowLayout이다.

		panel1.add(button1);
		panel1.add(button2);
		panel1.add(button3);
		panel1.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
		panel2.add(button4);
		panel2.add(button5);
		panel2.add(button6);
		panel2.setLayout(new FlowLayout(FlowLayout.RIGHT, 0, 0));

		setVisible(true);
	}

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

 

'자바' 카테고리의 다른 글

외부 클래스를 이용한 집만들기!  (1) 2023.02.21
외부 클래스 내부클래스를 이용 GUI  (0) 2023.02.21
GUI 프로그램  (0) 2023.02.20
Object 클래스  (0) 2023.02.20
인터페이스(interface)  (0) 2023.02.20

GUI프로그램 익숙해지기!!!!

package ch01;

import java.awt.FlowLayout;

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

public class FlowLayoutEx3 extends JFrame {

	// 배열 사용하고 버튼을 8개를 만든다
	private JButton[] button = new JButton[8];

	public FlowLayoutEx3() {
		initData();
		setInitLayout();
	}

	private void initData() {
		setTitle("FlowLayoutEx2");
		setSize(600, 600);
		setVisible(true);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		for (int i = 0; i < button.length; i++) {
			button[i] = new JButton("button"+(i+1));
		}
	}

	private void setInitLayout() {
		setLayout(new FlowLayout(FlowLayout.CENTER, 10, 10));
		for (int i = 0; i < button.length; i++) {
			add(button[i]);
		}
	}

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

배치관리자 FlowLayout 사용으로 수평으로 배치함

위치값 센터 중앙정렬과 위와 옆 10 씩 간격

 

'자바' 카테고리의 다른 글

외부 클래스 내부클래스를 이용 GUI  (0) 2023.02.21
Swing 을 이용한 GUI  (0) 2023.02.21
Object 클래스  (0) 2023.02.20
인터페이스(interface)  (0) 2023.02.20
Git  (0) 2023.02.16

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

Object 란 java.lang.* 패키지에 존재하면 모든 클래스의 최상의 클래스 이다.

 

toString() : Object 클래스에 있는 메소드 이며 자신에 주소 값을 String 으로 반환할 수 있고 필요하다면 자식 클래스에서 재정의 가능하다.

 

equals() : Object 클래스에 존재하는 메서드 이며 필요에 의해 자식 클래스에서 재 정의 가능하다.

package ch07;

/**
 * Object 클래스에 이해 
 * 자바는 단일 상속만을 지원한다. 
 * 하지만 모든 클래스의 최상위 클래스 Object 클래스는 예외 이다. 
 */
public class Book  {
	
	private int bookId; 
	private String title; 
	private String author;
	
	public Book(int bookId, String title, String author) {
		this.bookId = bookId; 
		this.title = title; 
		this.author = author;
	}
	
	
	// 코드힌트 살펴 보기 
	// extends Object 키워드를 작성하지 않더라도 컴파일러가 .class 생성시 
	// 자동으로 넣어 준다.
	
	// toString() <-- Object 클래스에 메서드 이다. 
	@Override
	public String toString() {
		return "[ "+this.title+" ]";
	}
	
	// equals 메서드 재정의 하기
	// 책 제목과 작가이름이 같다면 같은 책이라고 판별 해보자 
	@Override
	public boolean equals(Object obj) {
		// 만약 외주에서 주입된 값에 title 과 author 이 같다면 true를 리턴 
		// 아니라면 false 리턴하자 
		// Book 이라는 데이터 타입만 확인하자 !!! 방어적 코드 작성 
		if(obj instanceof Book) {
			Book targetBook = (Book)obj;
			if(this.title ==  targetBook.title) {
				System.out.println("같은 책 제목 입니다.");
				return true; 
			}
		}
		return false;
	}
	
}

응용하기!!

class파일

package ch07;

public class Student {

	// 학번과 이름을 정의 해주시고
	private String number;
	private String name;

	public Student(String number, String name) {
		this.number = number;
		this.name = name;
	}

	// toString --> 학번과 이름이 화면에 출력할수 있도록 설계
	@Override
	public String toString() {

		return "이름은 : " + "[" + this.name + "]" + " 학번은 : " + "[" + this.number + "]";
	}

	// equals 메서드를 제정의 해주세요
	// 이름이 같다면 동명이인 입니다
	@Override
	public boolean equals(Object obj) {

		if (obj instanceof Student) {
			Student targetStudent = (Student) obj;
			if (this.name == targetStudent.name) {
				// System.out.println("동명이인 입니다");
				return true;
			}
		}
		return false;
	}

}// end class

main 파일

package ch07;

public class MainTest3 {

	public static void main(String[] args) {
		Student student1 = new Student("21605034", "김민우");
		Student student2 = new Student("21604534", "김민우");
		Student student3 = new Student("21605054", "김미니");
		System.out.println(student1);
		System.out.println("------------------------------");

		if (student1.equals(student2)) {
			System.out.println("동명이인 입니다");
		} else {
			System.out.println("동명이인이 아닙니다");
		}

		boolean result1 = student1.equals(student3);
		boolean result2 = student1.equals(student2);
		System.out.println(result1);
		System.out.println(result2);

	}

}

'자바' 카테고리의 다른 글

Swing 을 이용한 GUI  (0) 2023.02.21
GUI 프로그램  (0) 2023.02.20
인터페이스(interface)  (0) 2023.02.20
Git  (0) 2023.02.16
추상 클래스의 응용 - 템플릿 메서드 패턴  (0) 2023.02.16

인터페이스란?

● 모든 메서드가 추상 메서드로 선언됨 public abstract

● 모든 변수는 상수로 선언됨 public static final

인터페이스 활용1

package ch02;

public interface RemoteController {

	// 모든 변수는 --> public static final
	// 모든 메서드는 --> 추상메서드!!

	// 인터페이스란?
	// 구현된 것이 아무것도 없는 밑그림만 있는 기본 설계도

	// 특성
	// 맴버 변수 , 일반 구현 메서드를 가질수 없고 오직 추상메서드와 상수만을 멤버로 가질수 있다.
	// 인터페이스는 표준,약속(강제성있는 규칙)

	// 추상클래스보다 추상화가 더 높다
	public static final int SERIAL_NUMBER = 100; // 상수만 가질수있다

	public abstract void turnOn();

	// public abstract void turnOff();

	// 메서드 --> 추상메서드
	void turnOff(); // -->public abstract 생략 가능하다 --> 왜? 추상매서드만 인지하기 떄문에 자동으로 붙여준다

}

 

package ch02;

public interface SoundEffect {

	public abstract void soundOn();
	//void soundOn();// 생략 가능 
}
package ch02;

public class Televison extends HomeAppliances implements RemoteController {

	@Override
	public void turnOn() {
		// TODO Auto-generated method stub
		System.out.println("TV를 켭니다");

	}

	@Override
	public void turnOff() {
		// TODO Auto-generated method stub
		System.out.println("TV를 켭니다");

	}

}
package ch02;

public class ToyRobot implements RemoteController, SoundEffect {

	String name;

	@Override
	public void turnOn() {
		System.out.println("장난감 로봇을 켭니다");

	}

	@Override
	public void turnOff() {
		System.out.println("장난감 로봇을 끕니다");

	}

	@Override
	public void soundOn() {
		System.out.println("두두두두두두두두두");

	}

}// class end
package ch02;

public class Refrigerator extends HomeAppliances 
implements RemoteController,SoundEffect{

	@Override
	public void turnOn() {
		System.out.println("냉장고를 작동시킵니다");

	}

	@Override
	public void turnOff() {
		System.out.println("냉장고의 작동을끕니다");
	}

	@Override
	public void soundOn() {
		System.out.println("띠리리링~~ 냉장고 문열림");
		
	}

}
package ch02;

public class MainTest1 {

	public static void main(String[] args) {

		Televison televison = new Televison();
		Refrigerator refrigerator = new Refrigerator();
		ToyRobot toyRobot = new ToyRobot();
		ToyCar toyCar = new ToyCar();

		// 다형성
		RemoteController controller1 = televison;
		RemoteController controller2 = refrigerator;
		RemoteController controller3 = toyRobot;
		RemoteController controller4 = toyCar;

		// 다형성 -> 배열
		RemoteController[] remoteControllers = new RemoteController[4];
		remoteControllers[0] = televison;
		remoteControllers[1] = refrigerator;
		remoteControllers[2] = toyRobot;
		remoteControllers[3] = toyCar;

		// 문제 1
		// for문 을 활용해서 전원을 전부다 켜주세요
		for (int i = 0; i < remoteControllers.length; i++) {
			// 0-->TV
			remoteControllers[i].turnOn();// 컴 파일 시점, turnOn, turnOff 확인가능
		}

		// index 값이 3번쨰 녀석이면 자기 자신의 타입을 화면에 풀력 해주세요
		for (int i = 0; i < remoteControllers.length; i++) {
			if (i == 3) {
				System.out.println("3번째 인덱스의 녀석은 ToyCar 입니다");
			}
		}
		// 문제3
		// 데이터가 로봇이면 맴버변수 name 출력
		for (int i = 0; i < remoteControllers.length; i++) {
			if (remoteControllers[i] instanceof ToyRobot) {
				// 업캐스팅 된상태이기떄문에
				// 자식 타입으로 바라보기 떄문에 다운캐스팅 개념을 알아야한다
				System.out.println(((ToyRobot) remoteControllers[i]).name);
			}
		}
		// 문제 4
		// 장난감 로봇에 소리 기능을 추가 해 달라는 요청
		// 냉장고에도 소리 나는 기능을 추가 해달라
		// 소리 라는 기능을 인터페이스로 설계

	}// end of main

}// end of class

 

인터페이스 활용2

인터페이스 파일

package ch06;

public interface IUserInfoDao {

	void insertUserInfo(UserInfo userInfo);

	void updateUserInfo(UserInfo userInfo);

	void deleteUserInfo(String userName);

	void selecteUserInfo(String userName);

}
package ch06;

//DTO : Data Transfer Object
public class UserInfo {
	public static int SERIAL_NUMBER = 0;
	private int id;
	private String userName;
	private String pw;

	public UserInfo(String userName, String pw) {
		SERIAL_NUMBER++;
		this.id = SERIAL_NUMBER;
		this.userName = userName;
		this.pw = pw;
	}

	public int getId() {
		return id;
	}

	public String getUserName() {
		return userName;
	}

	public String getPw() {
		return pw;
	}

	public void showInfo() {
		System.out.println("사용자 정보확인");
		System.out.println("UserName : " + userName);
		System.out.println("pw :" + pw);
	}
}
package ch06;

public class UserInfoMsSqlDao implements IUserInfoDao {

	@Override
	public void insertUserInfo(UserInfo userInfo) {
		System.out.println("MSSQL : 저장 기능 호출");
		System.out.println("이름 : " + userInfo.getUserName());
		System.out.println("PW : " + userInfo.getPw());

	}

	@Override
	public void updateUserInfo(UserInfo userInfo) {
		System.out.println("MSSQL : 수정 기능 호출");
		System.out.println("이름 : " + userInfo.getUserName());
		System.out.println("PW : " + userInfo.getPw());

	}

	@Override
	public void deleteUserInfo(String userName) {
		System.out.println("MSSQL : 삭제 기능 호출");
		System.out.println("사용자이름으로 삭제기능호출 : " + userName);

	}

	@Override
	public void selecteUserInfo(String userName) {
		System.out.println("MSSQL : 조회 기능 호출");
		System.out.println("사용자 이름으로 조회기능 호출 : " + userName);

	}

}
package ch06;

public class UserInfoMysqlDao implements IUserInfoDao {

	// DB 연결 하는 코드 작성 ( 이름 ,PW)
	// 질의성 생성
	// 결과 집합
	@Override
	public void insertUserInfo(UserInfo userInfo) {
		System.out.println("MYSQL : 저장 기능 호출");
		System.out.println("이름 : " + userInfo.getUserName());
		System.out.println("PW : " + userInfo.getPw());

	}

	@Override
	public void updateUserInfo(UserInfo userInfo) {
		System.out.println("MYSQL : 수정 기능 호출");
		System.out.println("이름 : " + userInfo.getUserName());
		System.out.println("PW : " + userInfo.getPw());

	}

	@Override
	public void deleteUserInfo(String userName) {
		System.out.println("MYSQL : 삭제 기능 호출");
		System.out.println("이름 : " + userName);
	}

	@Override
	public void selecteUserInfo(String userName) {
		System.out.println("MYSQL : 조회 기능 호출");
		System.out.println("이름 : " + userName);
	}

	// DAO
	// 앞단에서 던져 준 데이터를 가지고 -- DB에 값을 밀어 넣는 기능을 만들거임

}
package ch06;

public class UserInfoOracleDao implements IUserInfoDao {

	@Override
	public void insertUserInfo(UserInfo userInfo) {
		System.out.println("Oracle : 저장 기능 호출");
		System.out.println("이름 : " + userInfo.getUserName());
		System.out.println("PW : " + userInfo.getPw());

	}

	@Override
	public void updateUserInfo(UserInfo userInfo) {
		System.out.println("Oracle : 수정 기능 호출");
		System.out.println("이름 : " + userInfo.getUserName());
		System.out.println("PW : " + userInfo.getPw());

	}

	@Override
	public void deleteUserInfo(String userName) {
		System.out.println("Oracle : 삭제 기능 호출");
		System.out.println("이름 : " + userName);
	}

	@Override
	public void selecteUserInfo(String userName) {
		System.out.println("Oracle : 조회 기능 호출");
		System.out.println("이름 : " + userName);
	}

}
package ch06;

import java.util.Scanner;

public class UserInfoClient {
	static String dbName = "Oracle";

	// main --> 실행하는 코드작성
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		// 오라클 DAO만들기
		// 스캐너를 통해서 사용자이름,비번 입력 받기
		System.out.println("사용자의 이름을 입력해주세여");
		String inputUserName = sc.nextLine();
		System.out.println("사용자의 비밀번호를 입력해주세요");
		String inputUserPw = sc.nextLine();

		UserInfo userInfo = new UserInfo(inputUserName, inputUserPw);

		// 흐름 만들기 1
		// 1저장기능

		IUserInfoDao dao;
		if (UserInfoClient.dbName.equals("Oracle")) {
			dao = new UserInfoOracleDao();
		} else if (UserInfoClient.dbName.equals("MYSQL")) {
			dao = new UserInfoMysqlDao();
		} else {
			dao = new UserInfoMsSqlDao();
		}
		dao.insertUserInfo(userInfo);
		// 2 수정기능
		dao.updateUserInfo(userInfo);

	}// end of main

}// end of class

'자바' 카테고리의 다른 글

GUI 프로그램  (0) 2023.02.20
Object 클래스  (0) 2023.02.20
Git  (0) 2023.02.16
추상 클래스의 응용 - 템플릿 메서드 패턴  (0) 2023.02.16
추상 클래스(abstract class)  (0) 2023.02.16

Git

우리가 Git 을 사용해야 하는 이유?

▶ 소스코드나 작업물을 관리할 때 편리하기 때문입니다.

Git 이란?

● Git은 분산형 버전관리 시스템 입니다. (Distributed Version Control System)

버전 관리 시스템이란? (Version Control System)

● VCS은 사용자 프로젝트에 포함된 파일의 변경 내역을 추적할 수 있도록 하는 도구 또는 방법론입니다.

소프트웨어 형상관리

SoftWare Configuration Management 줄여서 SCM이라는 단어를 쓰기도 하는데, SW 개발 및 유지 보수 과정에서 발생하는 소스코드, 문서, 인터페이스 등 각종 결과물에 대한 형상을 만들고 이를 형상에 대한 변경을 체계적으로 관리, 제어하기 위한 활동입니다.

형상관리는 일반적으로 version control, revision control, source control, source code management, SCM 등 동일한 의미로 사용됩니다.

기존 버전 관리 시스템은 중앙 서버에 소스코드와 history를 직접 저장하는 방식

▶ 분산 버전 관리 시스템은 여러 개발 PC와 저장소에 분산해서 저장하는 방식

 

중앙집중식 버전관리 - SVN(Subversion)

▶ 각 개발자만의 version history를 관리할 수 없다.

▶ commit 한 내용에 실수가 있을 시에 서버에(다른 개발자에게) 바로 영향을 미치게 되고 만약 중앙 서버에 문제가

생기면 협업이 불가능

분산형 버전관리 - Git

▶ 모든 작업자가 원본을 가질 수 있다.

▶ 개별 history를 관리할 수 있기 때문에 네트워크를 사용하지 못하는 상황에서도 대부분의 작업 진행이 가능하다.

'자바' 카테고리의 다른 글

Object 클래스  (0) 2023.02.20
인터페이스(interface)  (0) 2023.02.20
추상 클래스의 응용 - 템플릿 메서드 패턴  (0) 2023.02.16
추상 클래스(abstract class)  (0) 2023.02.16
상속  (0) 2023.02.16

템플릿 메서드

● 추상 메서드나 구현 된 메서드를 활용하여 코드의 흐름(시나리오)를 정의하는 메서드

● final로 선언하여 하위 클래스에서 재정의 할 수 없게 함

● 프레임워크에서 많이 사용되는 설계 패턴

● 추상 클래스로 선언된 상위 클래스에서 템플릿 메서드를 활용하여 전체적인 흐름을 정의 하고 하위 클래스에서

● 다르게 구현되어야 하는 부분은 추상 메서드로 선언하여 하위 클래스에서 구현 하도록 함

final 예약어

● final 변수 : 값이 변경될 수 없는 상수

public static final double PI = 3.14;

● final 메서드 : 하위 클래스에서 재정의 할 수 없는 메서드

● final 클래스 : 상속할 수 없는 클래스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package ch13;
 
public class MainTest1 {
 
    public static void main(String[] args) {
 
        AiCar aiCar = new AiCar();
        aiCar.run();
        System.out.println("------------");
        ManualCar manualCar = new ManualCar();
        manualCar.run();
        manualCar.run();
    }
 
}
 
cs
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
package ch13;
 
public class AiCar extends Car {
 
    @Override
    public void drive() {
        System.out.println("자율주행을 합니다");
        System.out.println("자동차가 스스로 방향을 바꿉니다");
 
    }
 
    @Override
    public void stop() {
        System.out.println("자동차 스스로 멈춤");
    }
 
    @Override
    public void wiper() {
        System.out.println("스스로 빗물 제거");
    }
    
    @Override
    public void washCar() {
        System.out.println("스스로 세차 합니다");
    }
}
 
cs
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package ch13;
 
/**
 * 
 * 
 * 
 * @author GGG 템플릿 메서드 패턴을 구현 핵심 run() 메서드
 *
 */
public abstract class Car {
 
    protected abstract void drive();
 
    protected abstract void stop();
 
    private void startCar() {
        System.out.println("시동을 켭니다");
    }
 
    private void turnOff() {
        System.out.println("시동을 끕니다");
 
    }
 
    public abstract void wiper();
    
    //후크 메서드
    public void washCar() {
        //암것도 구현하지 않음 --> 일반 메서드이다
        
        
    }
 
    // 실행의 흐름을 만들어둔다
    // 재정의 할 수 없게 설계 한다 --> final (메서드 앞)
    // 하위 클래스에서 재정이 할 수 없음
    final public void run() {
        startCar();
        drive();
        wiper();
        stop();
        turnOff();
        washCar();
    }
}
 
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package ch13;
 
public class ManualCar extends Car {
 
    @Override
    public void drive() {
        System.out.println("사람이 운전을 합니다");
    }
 
    @Override
    public void stop() {
        System.out.println("사람이 브레이크를 씁니다");
    }
 
    @Override
    public void wiper() {
        System.out.println("사람이 작동을 시킵니다");
    }
}
 
cs

 

'자바' 카테고리의 다른 글

인터페이스(interface)  (0) 2023.02.20
Git  (0) 2023.02.16
추상 클래스(abstract class)  (0) 2023.02.16
상속  (0) 2023.02.16
다형성  (0) 2023.02.16
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package ch12;
 
public class MyNoteBook extends NoteBook {
 
    @Override
    public void typing() {
        System.out.println("섹시꽃남민우가 타자를 칩니다");
    }
 
    @Override
    public void display() {
        System.out.println("섹시꽃남민우가 화면을 킵니다");
    
    }
}
 
cs

추상 클래스란?

구현 코드 없이 메서드의 선언만 있는 추상 메서드(abstract method)를 포함한 클래스

메서드 선언(declaration) : 반환타입, 메서드 이름, 매개변수로 구성

메서드 정의(definition) : 메서드 구현(implementation)과 동일한 의미 구현부(body) 를 가짐 ({ })

예) int add(int x, int y); // 선언

int add(int x, int y){ } // 구현부가 있음, 추상 메서드 아님

abstract 예약어를 사용

추상 클래스는 new 할 수 없음 ( 인스턴스화 할 수 없음 )

추상 클래스 구현하기

메서드에 구현 코드가 없으면 abstract 로 선언

abstract로 선언된 메서드를 가진 클래스는 abstract로 선언

모든 메서드가 구현 된 클래스라도 abstract로 선언되면 추상 클래스로 인스턴스화 할 수 없음

추상 클래스의 추상 메서드는 하위 클래스가 상속 하여 구현

추상 클래스 내의 추상 메서드 : 하위 클래스가 구현해야 하는 메서드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package ch12;
 
 
// 강제성 : 추상 메서드를 포함 하고 있는 클래스는
// 반드시 추상 클래스가 되어야한다
public abstract class Animal {
 
    //추상클래스란 (abstract class)
    //하나이상의 추상 메서드 포함하거나 abstract 키워들 가진 클래스를 추상 클래스라고 한다.
    
    public void move() {
        System.out.println("동물이 움직입니다");
    }
    //추상메서드 이다
    public abstract void hunt();
    
}
 
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package ch12;
 
//public abstract class Human extends Animal {  --> 1.번 해결방안
//1.추상 메서드를 포함 하게 되면  추상 클래스로 만들어주면 된다
public class Human extends Animal {
 
    // 2.번
    // 부모클래스에 있는 추상 메서드를 자식 클래스에서
    // 일반 메서드로 재 정의 하였다
    @Override
    public void hunt() {
        // 1000줄
        System.out.println("Human 사냥을 합니다");
    }
 
}
 
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package ch12;
 
public class Person extends Human {
 
    @Override
    public void hunt() {
        // 1000줄은 부모 메서드와 똑같아야함
        super.hunt();// 부모에 있는 메서드를 호출 하라!!
        System.out.println("임마는 사람이야!!!");
        //
    }
 
}
 
cs

main 에서 확인해보기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package ch12;
 
public class MainTest1 {
 
    public static void main(String[] args) {
        // 기본적으로 추상클래스는 new 할수없다
        // abstract --> 개발자 한테 직접 new를 막아버림
        // Animal animal = new Animal(); <- 추상 클래스
        Animal animalHuman = new Human();
        animalHuman.hunt();
        System.out.println("---------------");
        Animal animalPerson = new Person();
        animalPerson.hunt(); // 런타임 시점에 누구의 메서드? Person 에 있는 메서드를 호출한다.
 
    }
 
}
 
cs

컴퓨터를 설계할때

추상메서드는 기울어져있다

그림의 상속 구조와 추상 클래스 구조 만들어보기

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package ch12;
 
public abstract class Computer {
 
    public abstract void display();
    
    public abstract void typing();
    
    public void turnOn() {
        System.out.println("전원을 킵니다");
    }
    public void turnOff() {
        System.out.println("전원을 끕니다");
    }
    
    public static void main(String[] args) {
        
        Computer[] computers = new Computer[300];
        
        computers[0= new DeskTop();
        computers[1= new DeskTop();
        computers[2= new MyNoteBook();
        for (int i = 0; i < computers.length; i++) {
            if(computers[i] != null) {
                computers[i].display();
                if(computers[i] instanceof MyNoteBook) {
                    System.out.println("섹시꽃남민우의 노트북이네요");
                }
            }
        }
        
        
        Computer desktop = new DeskTop(); 
        Computer myNoteBook = new MyNoteBook();        
        
//        desktop.turnOn();
//        desktop.turnOff();
//        desktop.display();
//        desktop.typing();
//        myNoteBook.turnOn();
//        myNoteBook.turnOff();
//        myNoteBook.typing();
//        myNoteBook.display();
    }
}
 
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package ch12;
 
public class DeskTop extends Computer{
 
    @Override
    public void display() {
        System.out.println("섹시꽃남 민우가 모니터 출력을 합니다");
    }
    
    @Override
    public void typing() {
            System.out.println("섹시꽃남 민우가 타자를 칩니다");
    }
}
 
cs
1
2
3
4
5
6
7
8
9
10
11
package ch12;
 
public abstract class NoteBook extends Computer{
 
    @Override
    public void typing() {
        System.out.println("노트북의 타자를 칩니다");    
    }
    
}
 
cs

'자바' 카테고리의 다른 글

Git  (0) 2023.02.16
추상 클래스의 응용 - 템플릿 메서드 패턴  (0) 2023.02.16
상속  (0) 2023.02.16
다형성  (0) 2023.02.16
Static 변수  (0) 2023.02.15

+ Recent posts