이안의 평일코딩

JAVA의 정석 22일차 - 객체지향 다형성 본문

Back-end/Java

JAVA의 정석 22일차 - 객체지향 다형성

이안92 2020. 7. 14. 12:36
반응형

2020.07.14(화)

 

1. 객체지향 프로그램 (OOP)

 1) 3대요소(권장사항)

   (1) 캡슐화 : 데이터 보호 (다른 클래스에서 값을 변경)

         => 클래스마다 경계 구분

   (2) 상속 : 재사용기법 (or 포함클래스:변경x/ 상속은 변경. 속도느림)

                => 코드의 중복제거 => extends 기존 클래스 확장

   생성자 상속불가

   static 사용가능 (상속)

   private 상속 가능 but 접근 불가

   새로운 기능 추가 => 오버라이딩

         단일상속 : class / 다중상속 : interface

   (3) 다형성 : 여러가지 형태로 사용 (추가, 수정)

        = 오버로딩 : 새롭게 추가

        = 오버라이딩 : 수정. 기존에 있던 것을 변경해서 씀

 

 

 

오버로딩 오버라이딩
메소드명이 동일 메소드명이 동일
메소드 매개변수 갯수나 데이터형이 다르다 메소드 매개변수 갯수와 데이터형이 동일
리턴형 같아도 되고 달라도 된다 리턴형이 동일해야함
같은 클래스 상 상속을 받아야 사용
  확장가능, 축소는 불가능
public > protected > default > private

 

** 자바
   1번째줄 => package명(한번만 사용이 가능)
   2번째줄 => import(여러번 사용이 가능)
   3번째줄 =>
   public class className{
   필요한 변수 설정 ==> 멤버변수
   변수에 대한 초기화 ==> 생성자
   기능 ==> 메소드
   }
   ===> 다른 클래스에 사용시에는

            import com.sist.opp.*

 

  패키지
    com.회사명.기능명 => com.sist.client , com.sist.server

    org.조직명.기능명 => org.springframework.web.servlet.view.*

 

  캡슐화
     = 변수는 private
     = 메소드 public ==> 변수 (getter/setter)


  상속
     = extends : 기존의 클래스를 기능을 가지고 온다
        단일 상속만 가능


  다형성
    = 수정, 추가
   ===========================문법사항이 아니라 권장 사항

 

2. 오버로딩 (생성자에서 주로 사용)

     = 같은 메소드명으로 여러개의 기능을 만든다

               =========

               1. 매개변수가 다르다(갯수나 데이터형이 다르다)

               2. 리턴형은 관계없다

               3. 같은 클래스내에서 만든다

 

            plus() :

            int + int ================> plusInt(int a, int b) => plus(int a, int b)

            double + double => plusDouble(double d, double d1) => plus(double d, double d1)

            int + double ======> plusIntDouble(int a, double d) => plus(int a, double d)

            String + String ====> plusString(String s1, String s2) => plus(String s1, String s2)

            float + double

            long + int

            int + char

            char + double

            String + char

 

 

package com.sist.oop;

class Calc{
	//인스턴스 메소드 : new사용시 마다 따로 저장되는 메소드
	public void plus(int a, int b) {
		System.out.printf("%d+%d=%d\n",a,b,a+b);
	}
	public void plus(double a, double b) {
		System.out.printf("%f+%f=%f\n",a,b,a+b);
	}
	public void plus(String a, String b) {
		System.out.printf("%s+%s=%s\n",a,b,a+b);
	}
	public double plus(double d, char c) {
		return d+c;
	}
	
}
/*
 * 변수
 * ==
 *  멤버변수
 *  static 공유변수
 * 메소드
 * ===
 *  멤버메소드
 *  static 메소드
 *  
 *  class A {
 *   int a;
 *   static int b;
 *   
 *   public void disp1() {
 *     => a,b 사용이 가능
 *     => disp2() 호출이 가능 
 *   }
 *   
 *   public static void disp2(){
 *     => b만 사용이 가능 (static은 static만 부를 수 있음)
 *     => disp1() , a를 사용할 수 없다
 *       =============
 *          => 사용시에는 반드시 new를 사용해서 사용
 *   }
 *  }
 *  
 */

public class 오버로딩_중복메소드정의 {
	int a=10;
	static int b=20;
	public static void main(String[] args) {
	Calc cc = new Calc(); // 메소드 전체가 저장
	cc.plus("Hello", "Java");
	cc.plus(100, 200);
	System.out.println(b);
	// System.out.println(a); static은 static만 부를수있음
	
	오버로딩_중복메소드정의 aa=new 오버로딩_중복메소드정의(); //메모리에 저장후 불러와야됨
	 System.out.println(aa.a);
	}
}
public class 오버로딩_중복메소드정의 {
	int a=10;
	static int b=20;
	
	public void disp1() {
		System.out.println(a);
		System.out.println(b);
	}
	public static void disp2() {
		System.out.println(b);
		오버로딩_중복메소드정의 aa=new 오버로딩_중복메소드정의();
		//System.out.println(a);
		System.out.println(aa.a);
	}
public class 오버로딩_중복메소드정의 {
	int a=10;
	static int b=20;
	
	public void disp1() {
		System.out.println(this.a); //충돌이 안될때 this(객체명가리킴) 생략가능
		System.out.println(this.b); //인스턴스는 각자 따로 갖고있음
	}
	public static void disp2() { //static안에는 this 존재안함 하나의 메소드만 가짐
		System.out.println(b);  
		오버로딩_중복메소드정의 aa=new 오버로딩_중복메소드정의();
		//System.out.println(a);  //static에서는 인스턴스 사용 불가
		System.out.println(aa.a);
	}
public class 오버로딩_중복메소드정의 {
	public 오버로딩_중복메소드정의() {
		System.out.println("this="+this); //동일 this=com.sist.oop.오버로딩_중복메소드정의@15db9742
	}
	public static void main(String[] args) {
	오버로딩_중복메소드정의 aa=new 오버로딩_중복메소드정의();
	System.out.println("aa="+aa);  //동일 aa=com.sist.oop.오버로딩_중복메소드정의@15db9742
	}
}

 

3. 오버라이딩

 1) 반드시 상속관계

 2) 메소드명이 동일

 3) 매개변수가 동일 (갯수, 데이터형)

 4) 리턴형도 동일

 5) 접근지정어는 확장, 축소할 수 없다

     =======

     public > protected > default > private

 

     => class A {

            private void display(){}

          }

          class B extends A {

            1. private void display(){}

            2. void display(){}

            3. protected void display(){}

            4. public void display(){}

          }

private면 private, default, protected, public

default면 default, protected, public

protected면 protected, public

public이면 public만 (접근 범위 가장 큰 public쓰면 모든 메소드 가능)

 

*캡슐화방식

class A {

   private int a;

   // setter/getter

}

 

package client;

public class Student {
	private int hakbun;
	public String name;
	String subject;
	protected String tel;
	
	Student() { //생성자가 default로 잡혀서 다른 패키지에서 사용불가 => 생성자 public으로 써야 호출가능.
		hakbun=1;
		name="홍길동";
		subject="물리";
		tel="010-1111-1111";	
	}
}
package server;

import client.Student;

public class SchoolSystem {
	public void display() {
		Student s = new Student(); // 생성자가 default라서 접근 불가능
	}
}

 

getter/setter 사용

package client;

public class Student {
	private int hakbun;
	public String name;
	String subject;
	protected String tel;
	
	public Student() { //생성자가 default로 잡혀서 다른 패키지에서 사용불가 => 생성자 public으로 써야 호출가능.
		hakbun=1;
		name="홍길동";
		subject="물리";
		tel="010-1111-1111";
		
	}

	public int getHakbun() {
		return hakbun;
	}

	public void setHakbun(int hakbun) {
		this.hakbun = hakbun;
	}

	public String getSubject() {
		return subject;
	}

	public void setSubject(String subject) {
		this.subject = subject;
	}

	public String getTel() {
		return tel;
	}

	public void setTel(String tel) {
		this.tel = tel;
	}
}
package server;

import client.Student;

public class SchoolSystem {
	public void display() {
		Student s = new Student();
		s.name="박문수";
		s.setHakbun(2);
		s.setSubject("영업");
		s.setTel("010-2222-2222");
		System.out.println("이름:"+s.name);
		System.out.println("전화:"+s.getTel());
		System.out.println("과목:"+s.getSubject());
		System.out.println("학번:"+s.getHakbun());
	}
	public static void main(String[] args) {
		//static과 달리 인스턴스들은 저장 해주려면 new연산자 사용
		SchoolSystem ss = new SchoolSystem();
		ss.display();
	}
}

 

변수(멤버,공유) => private => setter/getter

메소드 ==> public

생성자 ==> public

==============캡슐화 코딩

 

 

login

package com.sist.client;
import javax.swing.*;
import java.awt.*;

public class login extends JPanel{
	// 스킨
	private Image back;
	private JLabel la1, la2;
	// Login
	JTextField tf;
	JPasswordField pf;
	JButton b1, b2; //로그인, 취소버튼
	// MainForm
	public login() {
		//이미지 정보 읽기
		back = Toolkit.getDefaultToolkit().getImage("C:\\javaDev\\back.jpg");
		
		setLayout(null); //직접배치하겠다
		la1 = new JLabel("아이디",JLabel.RIGHT);
		la1.setBounds(5, 775, 85, 30);
		tf=new JTextField();
		tf.setBounds(100, 775, 150, 30);
		
		add(la1);add(tf);
		
		la2 = new JLabel("비밀번호",JLabel.RIGHT);
		la2.setBounds(5, 810, 85, 30);
		pf=new JPasswordField();
		pf.setBounds(100, 810, 150, 30);
		
		add(la2);add(pf);
		
		b1 = new JButton("로그인");
		b2 = new JButton("회원가입");
		JPanel p = new JPanel(); //패널을 묶어서 따로 배치하면 한번에 이동해서 위치조정이 더 쉬움
		p.add(b1);
		p.add(b2);
		p.setOpaque(false); //opaque투명모드. panel바탕이 투명으로 처리
		p.setBounds(55, 850, 235, 35); //x+width가 pf의 830+150랑 같아야함
		add(p);
	}
	@Override
	protected void paintComponent(Graphics g){
		g.drawImage(back, 0, 0, getWidth(), getHeight(), this);
	}
	
}

 

JoinForm

package com.sist.client;

import java.awt.*;
import javax.swing.*;
// JPanel 가지고 있는 모든 기능을 가지고 온다
// JoinForm = JPanel
/*
 * class A  =======> 데이터형 A
 * class B extends A ===> 데이터형 B, A
 * 
 * class 동물
 * 동물 a = new 동물()
 * Object obj = new 동물()
 * 
 * class 남자 extends 동물 ==> 남자, 동물
 * 남자 a = new 남자()
 * 동물 a = new 남자()
 * Object obj = new 남자()
 * 
 * ==> 상속
 * 	   모든 클래스는 Object 상속을 가지고 있다
 * 
 */

public class JoinForm extends JPanel {
	private Image back;
	JLabel title = new JLabel("회원가입",JLabel.CENTER);
	JLabel la1,la2,la3,la4,la5,la6,la7,la8,la9,la10,la11;
	JTextField tf1,tf2,tf3,tf4,tf5,tf6;
	JLabel dash = new JLabel("-");
	JButton b2 = new JButton("우편번호 검색");
	JPasswordField pf1,pf2;
	JRadioButton rb1,rb2;
	JTextArea ta;
	JCheckBox box1,box2,box3,box4,box5;
	//초기화
	JButton b1;
	JComboBox telBox = new JComboBox();
	JTextField tf7,tf8;
	JLabel dash2 = new JLabel("-");
	JButton b3=new JButton("회원가입");
	JButton b4=new JButton("취소");
	
	public JoinForm() {
		back = Toolkit.getDefaultToolkit().getImage("C:\\javaDev\\back.jpg");
		la1 = new JLabel("아이디",JLabel.RIGHT);
		la2 = new JLabel("비밀번호",JLabel.RIGHT);
		la3 = new JLabel("재입력",JLabel.RIGHT);
		la4 = new JLabel("이름",JLabel.RIGHT);
		la5 = new JLabel("성별",JLabel.RIGHT);
		la6 = new JLabel("우편번호",JLabel.RIGHT);
		la7 = new JLabel("주소",JLabel.RIGHT);
		la8 = new JLabel("상세주소",JLabel.RIGHT);
		la9 = new JLabel("전화번호",JLabel.RIGHT);
		la10 = new JLabel("소개",JLabel.RIGHT);
		la11 = new JLabel("레시피",JLabel.RIGHT);
		
		tf1 = new JTextField();
		tf2 = new JTextField();
		tf3 = new JTextField();
		tf4 = new JTextField();
		tf5 = new JTextField();
		tf6 = new JTextField();
		tf7 = new JTextField();
		tf8 = new JTextField();
		
		pf1 = new JPasswordField();
		pf2 = new JPasswordField();
		
		rb1 = new JRadioButton("남자");
		rb2 = new JRadioButton("여자");
		ButtonGroup gb = new ButtonGroup();
		gb.add(rb1);
		gb.add(rb2);
		
		b1=new JButton("중복체크");
		
		title.setFont(new Font("굴림체", Font.BOLD, 45)); 
		
		//배치
		setLayout(null); // 사용자 정의 배치 
		title.setBounds(10, 15, 1000, 55);
		//추가
		add(title);
		
		la1.setBounds(300, 100, 80, 30);
		tf1.setBounds(385, 100, 200, 30);
		b1.setBounds(600, 100, 100, 30);
		add(la1);add(tf1);add(b1);
		
		la2.setBounds(300, 135, 80, 30);
		pf1.setBounds(385, 135, 200, 30);
		add(la2);add(pf1);
		
		la3.setBounds(300, 170, 80, 30);
		pf2.setBounds(385, 170, 200, 30);
		add(la3);add(pf2);
		
		la4.setBounds(300, 205, 80, 30);
		tf2.setBounds(385, 205, 200, 30);
		add(la4);add(tf2);
		
		la5.setBounds(300, 240, 80, 30);
		rb1.setBounds(410, 240, 75, 30);
		rb2.setBounds(510, 240, 95, 30);
		add(la5);add(rb1);add(rb2);
		
		la6.setBounds(300, 275, 80, 30);
		tf3.setBounds(385, 275, 90, 30);
		dash.setBounds(483, 275, 20, 30);
		tf4.setBounds(495, 275, 90, 30);
		b2.setBounds(600, 275, 100, 30);
		add(la6);add(tf3);add(dash);add(tf4);add(b2);
		
		la7.setBounds(300, 310, 80, 30);
		tf5.setBounds(385, 310, 320, 30);
		add(la7);add(tf5);
		
		la8.setBounds(300, 345, 80, 30);
		tf6.setBounds(385, 345, 320, 30);
		add(la8);add(tf6);
		
		telBox.addItem("010");
		telBox.addItem("011");
		telBox.addItem("017");
		
		la9.setBounds(300, 380, 80, 30);
		telBox.setBounds(385, 380, 90, 30);
		tf7.setBounds(490, 380, 100, 30);
		dash2.setBounds(600, 380, 20, 30);
		tf8.setBounds(615, 380, 90, 30);
		add(la9);add(telBox);add(tf7);add(dash2);add(tf8);
		
		ta = new JTextArea();
		JScrollPane js = new JScrollPane(ta); //스크롤바
		add(ta);
		
		la10.setBounds(300, 415, 80, 30);
		js.setBounds(385, 415, 320, 160);
		add(la10);add(js);
		
		box1 = new JCheckBox("한식");
		box2 = new JCheckBox("중식");
		box3 = new JCheckBox("일식");
		box4 = new JCheckBox("양식");
		box5 = new JCheckBox("기타");
		
		JPanel p = new JPanel();
		
		p.add(box1);p.add(box2);p.add(box3);p.add(box4);p.add(box5);
		la11.setBounds(300, 580, 80, 30);
		p.setBounds(385, 580, 320, 35);
		add(la11);add(p);
		
		JPanel p2 = new JPanel();
		p2.add(b3);p2.add(b4);
		p2.setBounds(300, 620, 485, 35);
		add(p2);
		
		//투명모드
		p.setOpaque(false);
		p2.setOpaque(false);
		rb1.setOpaque(false);
		rb2.setOpaque(false);
		box1.setOpaque(false);
		box2.setOpaque(false);
		box3.setOpaque(false);
		box4.setOpaque(false);
		box5.setOpaque(false);
	}
	
	protected void paintComponent(Graphics g) {
		g.drawImage(back, 0, 0, getWidth(), getHeight(), this);
		
	}
}

 

RecipeMainFrame

package com.sist.client;
import java.awt.*;
import java.awt.event.*; //버튼 클릭할때 처리하는 내용포함

import javax.swing.*;

/*
 * 자바 패키지 => java(JDK1.0~), Java,javax(JDK1.2~)=>Java2,
 */
public class RecipeMainFrame extends JFrame implements ActionListener{ //창 따로 만들지않고 윈도우창 하나에다가
	//JFrame f = new JFrame();
	//배치
	CardLayout card = new CardLayout();
	login login=new login();
	JoinForm join=new JoinForm();
	public RecipeMainFrame() {
		//생성자 : GUI의 화면 디자인, 변수 초기화, 데이터베이스 연결, 서버연결, 쓰레드 동작
		//Layout => 화면 배치
		setLayout(card);
		
		// 화면추가
		add("LOGIN",login);
		add("JOIN",join);
		setSize(1024, 960);
		setVisible(true);
		setDefaultCloseOperation(EXIT_ON_CLOSE); //메모리회수
		
		login.b2.addActionListener(this);
		join.b3.addActionListener(this);
	}
	public static void main(String[] args) throws Exception{
		UIManager.setLookAndFeel("com.jtattoo.plaf.mcwin.McWinLookAndFeel");
		new RecipeMainFrame();

	}
	@Override
	public void actionPerformed(ActionEvent e) { //창이동
		if(e.getSource()==login.b2) {
			card.show(getContentPane(), "JOIN");
		}
		else if(e.getSource()==join.b3) {
			card.show(getContentPane(), "LOGIN");
		}
		
	}

}
반응형
Comments