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