배열
클래스 급이다.
new를 사용한다.
주소번지 : 간접 참조방식이다.
전변에 SCOPE를 갖는지 지변에 scope를 갖는지....???????
초기화는 책으로 공부하지 말기
변수는 한번에 하나만 가능하다.
배열은 끼워넣기가 안된다. 사이즈를 바꿀 수 없다. 상태를 관리하는게 중요하다.
배열은 한번에 여러개를 담을 수 있다.
배열은 같은타입만 담을 수 있다.----->해결 : 객체배열
단, 서로 다른 타입은 담을 수 있다.
클래스에는 두가지가 있다.
1. 기능 클래스- 기능을 담는 클래스(mian or 호출)
2.데이터 클래스-데이터를 담는 클래스
여기에는 반드시 메인이 있어야 한다. 또는 호출을 해야된다. 재사용성을 위해
파라미터와 리턴타입을 활용할 수 있어야한다.
데이터 클래스는 getter와 setter가있다.
getter=>read
setter=>write
자료구조-list, map
리스트 (List)
리스트는 배열과 비슷한 자바의 자료형으로 배열보다 편리한 기능을 많이 가지고 있다.
리스트와 배열의 가장 큰 차이는 배열은 크기가 정해져 있지만 리스트는 크기가 정해져 있지 않고 동적으로 변한다는 점이다. 예를 들어 배열의 크기를 10개로 정했다면 10개 이상의 값을 담을 수는 없다. 하지만 리스트는 크기가 정해져 있지 않다. 동적으로 자료형의 갯수가 변하는 상황이라면 List를 사용해야 할 것이다.
3차배열은 리스트나 맵으로 처리한다.
????이게 뭐지...??????
mian메소드와 sub메소드가있다...
sub s = new sub (this); 인스턴스화
( ) 여기에 파라미터 자리는 지역변수의 성격이다.
사용하려면 전역변수로 꺼내와야한다.
this.x = x;
전역변수
return
리턴은 값을 돌려주고 동시에 메소드를 종료한다.
return문으로 메소드를 빠져나가는 방법은 리턴 자료형이 void형인 메소드에서만 사용할 수 있다.
입력값도 리턴값도 없는 메소드
public void say() {
System.out.println("Hi");
}
위 say 메소드의 입출력 자료형은 다음과 같다.
- 입력 값 - 없음
- 리턴 값 - void (없음)
이를 호출하는 방법은 위 방법 단 한가지이다.
Test myTest = new Test();
myTest.say();
즉, 입력값도 리턴값도 없는 메소드는 다음과 같이 사용된다.
객체.메소드명()
전역변수에 대해서만 인스턴스 변수. 변수명 으로 호출할 수 있다.
package dev_java.view.week3;
public class Mian {
int i = 1;
//메인클래스에서 서브클래스에 있는 변수를 사용하고싶다.
public static void main(String[] args) {
Sub s = new Sub();
System.out.println(s.j);//전역변수만 .변수 이런형태 가능
s.account();
}
}
배열과 생성자
메인
package dev_java.view.week3;
public class Main_2 {
int i = 1;
//메인클래스에서 서브클래스에 있는 변수를 사용하고싶다.
boolean isOk[]=null;//배열은 안정해졌으면 무조건 널이다
//디폴트 생성자는 생략이 가능하다.
// 그러나 지금은 isOk배열의 생성을 위해서 getisOk()를 경유하도록 해야지 nullpointException을 피할 수 있다.
public Main_2(){//생성자가 없어서 만들어줌?? 클래스와 이름이 같고 반환 타입이 없으면 생성자이다.
System.out.println("Main_2()디폴트 생성자 호출 성공");
getisOk();//배열을 리턴하는 메소드를 갖고옴
}
//선언과 동시에 인스턴스화를 하지 않는 경우 게으른 인스턴스화라고 한다.
//선언과 생성을 동시에 하지 않고 메소드를 통해서 객체 주입을 받을 수 있음
//이럴 경우 메소드 안에서 if문을 사용해 널체크를 할 수 있어 싱글톤 패턴으로 객체를 주입
//주입 받을 수 있어 현업에서 선호하는 객체 주입 방법 중 하나입니다.
boolean[] getisOk(){//배열을 리턴하는 메소드
isOk=new boolean[]{ true, false, true};
return isOk;
}
public static void main(String[] args) {
Sub s = new Sub();
System.out.println(s.j);//전역변수만 .변수 이런형태 가능
s.account();
}
}
서브
package dev_java.view.week3;
public class Sub_2 {
public static void main(String[] args) {
Main_2 m1 = new Main_2(); //전역변수이지만 null이잖아...
System.out.println(m1.isOk);//주소값이 찍힌다
// m1.isOk; 배열은 이렇게 안됨
for(int i=0;i<m1.isOk.length;i++){//0,1,2까지 null이잖아? 길이 못구해... 그래서 생성자 필요
System.out.println(m1.isOk[i]);
}
System.out.println("===================");
for(boolean isOk : m1.isOk){//개선된 for문 for문에서 isOk변수를 설정하고 배열이 끝날때 까지 돌리기
System.out.println(isOk);
}
}
}
클래스 분리해서 UI구현하기
ui쪽과 로직쪽을 연결하고싶다.
이른 인스턴스화--> 선언부에서 한다.
scope? 전변의 scope...????
디폴트 생성자는 생략이 가능하다.
JVM이 대신 해주니까.
생성자도 인스턴스화하면 메소드 처럼 호출이 가능하다. new써서
그러나 리턴타입이 없다.
리턴타입이 있으면 메소드
리턴타입이 없으면 생성자(void도 없다. 아예 없다.)
public void initDisplay(){//UI를 그려준다. 이벤트 처리가 필요하다. 그래서 addactionListener가 필요하다.
jtf.addActionListener(this);//this 나자신 : 이벤트 핸들러 클래스의 주소번지
인터페이스는 추상메소드만 가지고 있어서 반드시 구현체 클래스가 필요하다.
액션 리스너는 인터페이스이다.
인터페이스의 기본 컨벤션 : 구현체 클래스를 가진다.
이벤트 핸들러 클래스는 메소드 오버라이드를 반드시 해야된다.
액션 퍼폼드
선언만 되어있다
메소드;----->호출이다. 예외는 추상 메소드 선언인데 호출하는 형식과 같이 ; 쓴다.
추상메소드란?
추상 메소드(abstract method)
추상 메소드(abstract method)란 자식 클래스에서 반드시 오버라이딩해야만 사용할 수 있는 메소드를 의미합니다.
자바에서 추상 메소드를 선언하여 사용하는 목적은 추상 메소드가 포함된 클래스를 상속받는 자식 클래스가 반드시 추상 메소드를 구현하도록 하기 위함입니다.
이러한 추상 메소드는 선언부만이 존재하며, 구현부는 작성되어 있지 않습니다.
바로 이 작성되어 있지 않은 구현부를 자식 클래스에서 오버라이딩하여 사용하는 것입니다.
abstract 반환타입 메소드이름();
.
추상메소드 선언은 인터페이스? 안에서 일어난다.
메세지 호출이 아닌데 ; 으로 끝난다.
정의 할 수 없다.
디바이스 즉, 장치가 결정되지 않았다.
추상메소드를 가지고 있으면 재정의를 해야한다.
그래서 메소드 오버라이딩을 해야한다.
반드시 구현체 클래스가 있어야한다.
인터페이스 중심으로 코딩을 전개하는것이 클래스간 결합도를 낮추고 재사용성은 높여주는 코딩 방법이다.
결정되지않았다. 인스턴스화 할 수 없다.
@override------>어노테이션
인터페이스는 반드시 구현체 클래스가 있어야 한다.
단독으로 인스턴스화 불가능하다
이거는 가능하다. 구현체 클래스이기 때문에.
인터페이스(interface)란?
자식 클래스가 여러 부모 클래스를 상속받을 수 있다면, 다양한 동작을 수행할 수 있다는 장점을 가지게 될 것입니다.
하지만 클래스를 이용하여 다중 상속을 할 경우 메소드 출처의 모호성 등 여러 가지 문제가 발생할 수 있어 자바에서는 클래스를 통한 다중 상속은 지원하지 않습니다.
하지만 다중 상속의 이점을 버릴 수는 없기에 자바에서는 인터페이스라는 것을 통해 다중 상속을 지원하고 있습니다.
인터페이스(interface)란 다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서, 다른 클래스 사이의 중간 매개 역할까지 담당하는 일종의 추상 클래스를 의미합니다.
자바에서 추상 클래스는 추상 메소드뿐만 아니라 생성자, 필드, 일반 메소드도 포함할 수 있습니다.
하지만 인터페이스(interface)는 오로지 추상 메소드와 상수만을 포함할 수 있습니다.
출처 : http://www.tcpschool.com/java/java_polymorphism_abstract
소스 리뷰
package dev_java.week3;
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class JTextAreaUI implements ActionListener{ //implements 결합도는 낮고 재사용성은 높여준다. 상속이 아니다. 추상메소드를 재정의함.
//선언부
JTextAreaUILogic jtaUILogic = new JTextAreaUILogic(this);//이른 인스턴스화 선언과 생성 동시에/ this는 로직에 값을 그대로 넘겨준다
//인터페이스는 반드시 구현체 클래스가 있어야 한다.
//단독으로 인스턴스화 불가함
//선언부와 생성부의 타입이 다르다-그래서 다형성이 가능함-폴리모피즘-재사용을 높이고 결합도는 낮춤
JFrame jf = new JFrame();
JTextArea jta = new JTextArea(10,20);
JTextField jtf = new JTextField(10);
public JTextAreaUI(){//디폴트 생성자 선언
initDisplay();
}
public void initDisplay(){//UI를 그려준다. 이벤트 처리가 필요하다. 그래서 addactionListener가 필요하다.
//이벤트소스와 이벤트 핸들러 클래스 매핑하기(매칭)
jtf.addActionListener(this);//this 나자신 : 이벤트 핸들러 클래스의 주소번지
//멀티라인 작성 가능한 콤포넌트 배경색 설정
jta.setBackground(Color.cyan);
//JFrame은 디폴트 레이아웃이 보더레이아웃이라서 동 서 남북 중아 배치가능
jf.add("Center", jta);//JTextArea는 중앙에 배치함
jf.add("South", jtf);//남쪽에는 JTextField에 배치함
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//윈도창 x버튼 클릭시 자원 회수함
jf.setSize(400, 300);//윈도우창 가로세로 결정
jf.setVisible(true);//화면을 출력함
}
public static void main(String[] args) {//가장먼저 호출됨. 엔트리 포인트이다.
new JTextAreaUI();//생성자 호출 되고 그 안에서 화면 그리는 메소드 호출됨
}
@Override//구현체 클래스. 어노테이션 annotation-문법적인 제약을 갖고있다. 선언부가 일치해야한다.
// 어떤 작업을 하겠다는 의미
public void actionPerformed(ActionEvent e) {//actionPerformed 콜백 메소드
//추상메소드의 파라미터를 통해서 감지된 컴포넌트의 주소번지를 얻어오는
//getSource메소드의 소유주임
Object obj = e.getSource();
if(jtf == obj){//JTeatField에 엔터 친거야?
//JTextField에 입력한 값 받기
String input = jtf.getText();
jta.append("JTextAreaUI원본"+input+"\n");
jtaUILogic.account(input);
jtf.setText("");
}
}
}
생성자 안에서 JTextArea원본과 전변을 초기화 해주어야 한다.
액션 리스너 인터페이스 구현은 위와같이 implements 라는 키워드를 사용한다.
객체가 한 개 이상의 자료형 타입을 갖게되는 특성을 다형성(폴리모피즘)
로직과 연결하기
package dev_java.week3;
import javax.swing.JTextArea;
//메모리 스택오버플로우 발생-서버가 중지됨
public class JTextAreaUILogic {
//여기서 직접인스턴스화하면 복제본-망함
// JTextAreaUI jta = new JTextAreaUI(10,20); 직접 인스턴스화
JTextAreaUI jtaUI = null;
public JTextAreaUILogic(JTextAreaUI jTextAreaUI){//생성자
//생성자 안에서 JTextArea원본과 전변을 초기화 해주어야 한다.
this.jtaUI=jTextAreaUI;//this로 원본 사용 앞에 this가 넘겨준다...?
}
public void account(String input){
System.out.println("호출성공");
//JTextAreaUI클래스에 정의된 주소번지를 사용하고 싶다. 어떡하지?
//insert here
jtaUI.jta.append("UILogic"+input+"\n");
}
}
선언만 해준다. 생성을 하면 새로운 복제본이 되기 때문이다.
this.jtaUI=jTextAreaUI; 앞의 UI클래스에서 파라미터값을 받아서 그대로 원본을 사용한다는 뜻....
이 문장이 로직과 유아이를 연결해 주고 있다.
jvm 주입을 받음--->제어 역전
action 이라는 자체가 사용자 정의 가 아니다.
ActionEvent에서 외부에서 필요할때에 넣어준다.
버튼을 눌렀을때 어떤 기능을 하는지 잘 모르겠다. 추상이다. 추상메소드
다트 연산자 앞에는 클래스 타입이나 소유주가 온다.
static 이 있으면 원본이 하나이다. 일반 객체를 생성할 때 와는 다르다.
서버에 스택을 남발하게되면 오버플로우가 일어나서 안된다.
object obj = e.getSource();---> 호출
e라는 객체는 주입을 받는 객체이다.
화면과 로직을 분리하기부터하자. 나중에는 3개 4개 더많이도 해야된다
initDisplay는 건드리지 않는다.
UI
JButton - 이벤트 소스
이벤트 핸들러는 무엇을 갖고있어야 할까요?
UI에 대한 주소번지를 갖고 있어야한다.
클래스 안에 클래스가 있는 구조이다.
객체안에 객체를 정의하는 구조이다.
클래스의 구성요소 필드와 메소드
누가 누구를 주입을 해야되나?------>내가 알고싶은거였다
클래스 쪼개기에서 먼저 생각할것은 그림을 똑바로 그리고 화살표를 똑바로 표현.....ㅠㅠㅠㅠㅠㅠㅠ
jbtn.addActionListener(???)
아까는 this였다.
이벤트 핸들러를 넣어야된다.
인스턴스화를 먼저 하기
그다음 생성자 호출
일단 지금은 클래스와 객체를 구분할수없다....-나
좀있다 나누자.
다형성이 재사용성이나 이식성을 좋게하는 핵심 키워드이다.
다형성의 개념
다형성(polymorphism)이란?
다형성(polymorphism)이란 하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미합니다.
자바에서는 이러한 다형성을 부모 클래스 타입의 참조 변수로 자식 클래스 타입의 인스턴스를 참조할 수 있도록 하여 구현하고 있습니다.
다형성은 상속, 추상화와 더불어 객체 지향 프로그래밍을 구성하는 중요한 특징 중 하나입니다.
참조 변수의 다형성
자바에서는 다형성을 위해 부모 클래스 타입의 참조 변수로 자식 클래스 타입의 인스턴스를 참조할 수 있도록 하고 있습니다.
이때 참조 변수가 사용할 수 있는 멤버의 개수가 실제 인스턴스의 멤버 개수보다 같거나 적어야 참조할 수 있습니다.
출처 : http://www.tcpschool.com/java/java_polymorphism_concept
생성자의 파라미터 자리에 있어야 하는것은 결국 UI이다. UI가 인스턴스화 시에 this로 들어가야한다.
UI이다...
UI.jbtn.xxxx()
다트연산자 두개??????
package dev_java.week3;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class JButtonUIEvent implements ActionListener{
JButtonUI jui=null;
public JButtonUIEvent(JButtonUI jButtonUI) { //빠른수정으로 추가
this.jui=jButtonUI;
}
@Override
public void actionPerformed(ActionEvent e) {
Object obj=e.getSource();
if (obj == jui.jbtn_south) {
System.out.println(jui.jbtn_south.getText() + "버튼 클릭");
}
}
}
Object obj=e.getSource();
obj라는 변수에 getSource로 액션이벤트메소드의 주소를 가져와서 넣었다.
액션리스너 클래스 안에 액션 이벤트라는 추상메소드가 있다.
만약, obj와 JButtonUIEvent의 jui는 UI를 인스턴스화 해서 남쪽 버튼의 객체 주소가 같으면 액션 이벤트가 일어난것이다.
그러면 "버튼클릭"을 실행한다.
쪼개기
package dev_java.week3;
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class JTextAreaUI2 {
// 선언부
JTextAreaUI2Event jEvent = new JTextAreaUI2Event(this);
JTextAreaUILogic jtaUILogic = new JTextAreaUILogic(this);
JFrame jf = new JFrame();
JTextArea jta = null;
JScrollPane jsp=null;
JTextField jtf = new JTextField(10);
public JTextAreaUI2() {
getTextArea();
initDisplay();
}
public JTextArea getTextArea(){
if(jta==null){
jta=new JTextArea(10,20);
jsp=new JScrollPane(jta,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
}
return jta;
}
public void initDisplay() {
jtf.addActionListener(jEvent);
jta.setBackground(Color.cyan);
jf.add("Center", jsp);
jf.add("South", jtf);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setSize(400, 300);
jf.setVisible(true);
}
public static void main(String[] args) {
new JTextAreaUI2();
}
}
package dev_java.week3;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class JTextAreaUI2Event implements ActionListener {//오버라이드랑 임플리먼트 세트이다
JTextAreaUI2 jUi2=null;
public JTextAreaUI2Event(JTextAreaUI2 jUi2){
this.jUi2=jUi2;
}
@Override
public void actionPerformed(ActionEvent e) {
Object obj=e.getSource();
if(jUi2.jtf==obj){
String input = jUi2.jtf.getText();
jUi2.getTextArea().append("JTextAreaUI원본"+input+"\n");
jUi2.jtaUILogic.account(input);
jUi2.jtf.setText("");
}
}
}
!!!!!!!!숙제!!!!!!!!!!
비주얼화 해보자.
'학원수업 > 12월' 카테고리의 다른 글
12/13 국비학원 자바수업 12회차(JTable, Static, 접근제한자) (0) | 2022.12.13 |
---|---|
12/12 숙제 풀이 (0) | 2022.12.13 |
12/09 국비학원 자바수업 10회차(equals, 다차원 배열) (1) | 2022.12.09 |
12/08 국비학원 자바수업 9회차(배열, UI API) (0) | 2022.12.08 |
12/07 국비학원 자바수업 8회차(배열, JUnit, 야구숫자게임) (0) | 2022.12.07 |
댓글