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();
}
}
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();
}
}
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);
}
}
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
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
● 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를 관리할 수 있기 때문에 네트워크를 사용하지 못하는 상황에서도 대부분의 작업 진행이 가능하다.