이안의 평일코딩

JAVA의 정석 21일차 - 객체지향 캡슐화, 상속 본문

Back-end/Java

JAVA의 정석 21일차 - 객체지향 캡슐화, 상속

이안92 2020. 7. 13. 12:47
반응형

2020.07.13(월)

 

https://mvnrepository.com/artifact/org.projectlombok/lombok/1.18.12

lombok 설치후 라이브러리 추가

 

* 클래스의 구성 요소

멤버변수

생성자

메소드

 

1. 객체지향의 3대 요소 

 = 데이터 보호 (데이터 사용하지 못하게 만드는 작업: 은닉화

                     클래스와 클래스의 연결 => 감춘 데이터를 메소드를 통해 접근이 가능: 캡슐화)

 

 = 접근지정어

    private

    protected

    public

    default

 

 = 재사용 기법

    = 상속 ==> is-a

    = 포함 ==> has-a

 

 = 수정, 추가

    = 다형성

       = 오버로딩 : 새로운 기능 추가

       = 오버라이딩 : 기존에 있는 기능을 수정

===========================================

=> 유지보수가 용이하게 만드는 기법 => 실행 속도가 늦다 (객체지향)

===>유지보수 쉽고 실행 속도가 빠르게 => POJO (Spring)

 

 

2. 접근지정어

  같은 클래스 같은 폴더
(패키지)
다른 폴더
상속을 받는 경우
모든 클래스
public O O O O
protected O O O  
default O O    
private O      

접근 범위 크기

public > protected > default > private

 

1) public : 공개(전체) : 어떤 위치든 상관없이 사용이 가능

    예) public int age;

2) protected : 상속을 받는 경우에 하위클래스에서 사용이 가능 (사용 빈도가 작다)

    예) protected String name;

      상속에서 예외 조건

      (1) static => 사용이 가능하게 만든다

      (2) private => 상속이 된다 => 사용이 불가능

      (3) 생성자 => 상속이되지 않는다

3) default : 같은 패키지 안에서만 사용이 가능 => src

   (앞에 키워드 없음. 지금까지 씀)

    예) String name;

4) private : 자신의 클래스에서만 사용이 가능 => 비공개

               => 다른 클래스에서도 사용이 가능 => 메소드를 통해서 접근이 가능하게 만든다

 

* 데이터 보호 : 값이 프로그램과 관련없이 변질, 값 변경될 수도 있다

                     => 캡슐화

                           ====> 1) 데이터 보호하는 목적 (데이터를 은닉화 => 필요 때만 메소드를 이용해서 사용)

                                      2) 경계구분 

* 사용방식

 멤버변수 => 다른 클래스에서 값을 변경할 수 없게 은닉화 => private

 ======= 

 메소드

 생성자

 ======= 다른 클래스와 연결해서 프로그램이 동작 => public

 

 

3. 캡슐화 => 관련 있는 것들끼리 모음
  경계 (클래스별로 분리)
  은닉화 (데이터 아무데나 쓸 수 없게)


  변수 => 읽기(저장된 데이터 읽기) , 쓰기(메모리에 저장)

import lombok.Getter;
import lombok.Setter;

// 변수 => 읽기(저장된 데이터 읽기) , 쓰기(메모리에 저장)
/*
 *      ======= 메소드 ======
 *      읽기 : getter() => 저장된 데이터 값 읽기 
 *      쓰기 : setter() => 변수값을 저장 
 *      
 *      private String name;
 *      캡슐화 방식 ==> 데이터를 보호하는 목적 
 *      ==> setter
 *          public void setName(String name)
 *          {
 *              this.name=name;
 *          }
 *      ==> getter
 *          public String getName()
 *          {
 *              return name;
 *          }
 */
@Getter
@Setter
class Student{
	private int hakbun;
	private String name;
	private String sex;
	/*
	public int getHakbun() {
		return hakbun;
	}
	public void setHakbun(int hakbun) {
		this.hakbun = hakbun;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	*/
	
}


  회원가입, 게시판, 영화정보
  =id
  =password
  =이름,나이,전화,주소
  =제목,내용,비밀번호,번호
  =번호,영화명,출연,감독,등급,장르
  
  경계를 구분
  ========
  회원가입
   =id
   =password
   =이름,나이,전화,주소
  ========
  영화정보
   =번호,영화명,출연,감독,등급,장르
  ========
  게시판
   =제목,내용,비밀번호,번호

 

class Member {
	// 인스턴스 변수 ==> 저장 ==> new
	private String name; // 접근이 불가능
	public int age; // 접근이 가능
	protected String addr; // 접근이 가능
	String tel; // 접근이 가능
	
	// 필요하면 변수를 사용이 가능하게 만든다
	//Setter
	public void setName(String n) { // 메모리에 저장 => 자동생성 lombok
		name = n;
	}
	//Getter
	public String getName() { // 메모리에서 데이터 읽기
		return name;
	}
}
public class MainClass {

	public static void main(String[] args) {
		// Member에 저장되어 있는 변수에 접근
		// Member를 저장
		Member m = new Member();
		// 변수값을 지정
		// m.name="홍길동";
		m.setName("홍길동");
		m.age=30;
		m.addr="서울";
		m.tel="010-1111-1111";
		
		// 출력
		System.out.println("이름:"+m.getName());
		System.out.println("나이:"+m.age);
		System.out.println("주소:"+m.addr);
		System.out.println("전화:"+m.tel);
	}

}
import lombok.Getter;
import lombok.Setter;

//캡슐화 : 변수 private, getter&setter
@Getter
@Setter

public class MovieVO {
	// 모든 멤버변수 ==> private
	private int mno;
	private String title;
	private String director;
	private String actor;
	private String genre;
	private String grade;
	private double scroe;
	private String story;
	
}

상속해주는 곳으로 화살표가 감
단일상속과 다중상속

4. 재사용 => 기존에 만들어진 클래스를 사용 (반복 코딩을 제거)

   1) 상속 (is-a) => 이미 만들어진 기능을 변경해서 사용 

                          public class MyWindow extends JFrame

                                                         ===== 확장된 클래스

// A클래스가 가지고 있는 모든 것이 상속 => 예외 (private, static, 생성자)
// 상위 super 하위 this. (this만 생략가능)
// extends String클래스는 상속 불가 (final 클래스임 확장불가)

public class A{
	private String name;
	int age;
	public void display();
}

public class B extends A{
//	int age;
//	public void display();
	// 눈에 보이지 않지만 A 내용이 자동으로 내려옴
}
*** 자바상속은 단일 상속 (

//기존에 만들어진 기능 수정, 변경해서 씀 => 오버라이딩

 

MainWindow

import javax.swing.*;
// 윈도우내용을 변경 => 상속 (모양, 내용 변경해서 쓰려면)
// class A extends JFrame
// 있는 그대로 => 포함 (있는 그대로 쓰려면)
/*
 * class A {
 * 	JFrame f = new JFrame();
 * }
 */
public class MainWindow extends JFrame{
	// 실행하자마자 => 윈도우를 생성
	// 생성자는 가급적이면 public메소드로 만든다
	public MainWindow() {
		// 윈도우 화면 설계
		setSize(800, 600); // JFrame => 메소드 => 상속
		setVisible(true);
	}
	public static void main(String[] args) {
		new MainWindow(); // new 붙여줘야됨
	}
}

 

 

MainView

import java.awt.*;
import javax.swing.*;

public class MainView extends JPanel{ //변경해야 되므로 포함클래스면 안되고 상속이어야함!
	Image back;
	// Image에 대한 초기화
	public MainView() {
		// 이미지 정보 읽기
		back=Toolkit.getDefaultToolkit().getImage("c:\\javaDev\\back.jpg"); //이미지 파일 가져옴
	}
	// 메소드 내용 변경 
	@Override
	protected void paintComponent(Graphics g) {
		g.drawImage(back,0,0,getWidth(),getHeight(),this);
	}
}

   2) 포함 (has-a) => 이미 만들어진 기능을 변경없이 그대로 사용

                            public class MyWindow {

                                  JFrame f = new JFrame();

                            }

import javax.swing.*;
/*
 *    자바의 모든 클래스는 상속(생략) 
 *    ========================
 *     class MainWindow2 extends Object
 *                               =======
 *                               모든 클래스가 상속을 받아서 처리 
 */
public class MainWindow2 {
	JFrame f = new JFrame();
	public MainWindow2() {
		f.setSize(800, 600);
		f.setVisible(true);
	}
	public static void main(String[] args) {
		new MainWindow2();
	}
}
import javax.swing.*;
public class MainWIndow3 extends JFrame{
	MainView mv = new MainView(); // 포함클래스
	public MainWIndow3() {
		add("Center",mv);
		setSize(800, 600);
		setVisible(true);
	}
	public static void main(String[] args) {
		new MainWIndow3();
	}
}

 

Swing ClassDiagram
Swing Components
AWT Components

윈도우

 = Container : Component를 여러개 묶어서 화면 출력

   = JFrame

   = JWIndow 

   = JDialog (모달형:대화상자 끝내야 다른 작업가능, 비모달형:여러개 창 가능)

   ========= 단독으로 실행이 가능

   = JPanel => 단독으로 실행이 불가능 => JFrame, JWindow, JDialog

 = Component : 한개의 기능만 가지고 있다

            JLabel => 일반 문자열 출력, 이미지 출력

            버튼 종류

               = 일반버튼

                     JButton

               = 토글버튼 (선택했을 때 모양 바뀜)

                     JRadioButton

                     JCheckBox

               = 메뉴

            입력창

               = 한줄입력 : JTextField

               = 비밀번호 : JPasswordField

               = 여러줄 입력 : JTextArea => 소개, 내용출력

               = 여러줄 입력 : JTextPane => 채팅

            목록창

               = 선택창 : JComboBox 

               = 전체 내용 => JList

               = JTree

               = JTable

            화면분할

               = JTabbedPane

               = JSpiltPane ==> <div>

               = JInteralFrame

=========================================== interface

 

===> 배치 (Layout), 사용자 정의 배치

         1. BorderLayout => 5군데

                  위, 아래, 가운데, 왼쪽, 오른쪽

         2. FlowLayout

         3. GridLayout

         4. CardLayout

         5. 사용자 정의 ====> setBounds(10,20,800,900)

 

===> 프로젝트 : 네트워크의 흐름파악

                       오라클

                       JSP

                       Spring

                       Kotlin

 

      1. 로그인 =====> 서버에서 저장

      2. 회원가입

      ==========================

      3. 목록 출력

      4. 상세보기

      5. 예매, 장바구니

      6. 마이페이지, 관리자페이지

      7. 채팅

      ==========================

 

login

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(745, 775, 85, 30);
		tf=new JTextField();
		tf.setBounds(830, 775, 150, 30);
		
		add(la1);add(tf);
		
		la2 = new JLabel("비밀번호",JLabel.RIGHT);
		la2.setBounds(745, 810, 85, 30);
		pf=new JPasswordField();
		pf.setBounds(830, 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(788, 850, 235, 35); //x+width가 pf의 830+150랑 같아야함
		add(p);
	}
	@Override
	protected void paintComponent(Graphics g){
		g.drawImage(back, 0, 0, getWidth(), getHeight(), this);
	}
	
}

 

MainForm

import javax.swing.*;
import java.awt.*;
/*
 * 변수 ============> 데이터를 감춘다 (은닉화 : private)
 *   일반변수 =>기본형
 *   배열 =>참조변수
 *   클래스 =>참조변수
 * =======
 * 메소드
 * 생성자
 * ======= 다른 클래스와 연결하는 역할 ==> public
 */
public class MainForm extends JFrame{
	private CardLayout card = new CardLayout(); //포함클래스
	//화면 UI => 생성자 => 시작하면 바로 보여준다
	//생성자 => 한번만 호출이 가능하고 시작과 동시에 호출이 되는 메소드
	//생성자는 모든 클래스에서 호출이 가능해야 한다 => public
	login login = new login();
	public MainForm() {
		// Layout 설정
		setLayout(card); //border=>card로
		add("LOGIN",login);
		/*
		 * JFrame, JWindow, JDialog => BorderLayout
		 * JPanel => FlowLayout
		 * 
		 * ==> 사용자 정의 사용 ==> setLayout(null) 넣어야 내 마음대로 크기 가능
		 */
		setBounds(400,60,1024,950); //가로공백,세로공백 / 창가로크기,세로크기
		//setSize(1000,900); 위치지정없이 창크기만 정해줌
		setVisible(true);
		
	}
	public static void main(String[] args) {
		new MainForm();
	}
}
반응형
Comments