일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- javascript
- 정보처리기사실기정리
- ReactNative
- 자바스크립트 코딩테스트
- 정보처리기사정리
- 오라클
- Oracle
- 정보처리기사
- 자바의정석
- CSS
- 스프링
- 이안의평일코딩
- Java의정석
- 자바스크립트
- 국비코딩
- 타입스크립트
- 코딩테스트
- 정보처리기사실기요약
- 자스코테
- 정보처리기사요약
- php
- 국비IT
- spring
- 리액트네이티브
- 리액트
- typescript
- 정보처리기사실기
- VUE
- react
- 평일코딩
- Today
- Total
이안의 평일코딩
JAVA의 정석 22일차 - 객체지향 다형성 본문
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");
}
}
}
'Back-end > Java' 카테고리의 다른 글
JAVA의 정석 24일차 - 추상클래스, 인터페이스 (0) | 2020.07.16 |
---|---|
JAVA의 정석 23일차 - 객체지향 (0) | 2020.07.15 |
JAVA의 정석 21일차 - 객체지향 캡슐화, 상속 (0) | 2020.07.13 |
JAVA의 정석 20일차 - 클래스 생성 (0) | 2020.07.10 |
JAVA의 정석 18일차 - 멤버변수와 공유변수 (0) | 2020.07.08 |