Java api document 자주 보기!
마커 인터페이스 : 부류 없이 이름만 있는 인터페이스. 구현해도 별다른 메서드가 없음. 특정 기능을 제공하는 클래스임을 표시하는 역할.
Serializable : 네트워크에서 이동할 수 있는 것은 데이터 가능하고 메서드는 불가능. 1byte(=stream)으로 흐르기 때문에 client에서 1byte씩 쪼개서 보내고, server에서 복원 절차 필요. 포장이사 느낌으로. 포장이사는 Serializable적용된 객체만 가능.
Comparble : 비교 가능 계열. 객체 간의 크기 비교.
CharSequence : 문자 시퀀스 계열. 문자열을 다루는 인터페이스
Generic : 빌드 과정에서 타입이 정해지는 것. 타입을 동적으로 할당하여 코드의 재사용성을 높임.
Modifier
abstract - 상속으로만 사용하도록 제한 (객체 생성 불가)
- class : 객체 생성 불가 클래스
- data : x
- method : 구현 블락 없음
final - 변경없이 사용하라. (PI 같은 것들)
- class : 상속 불가 (반대로 생각하면 final이 없으면 상속은 유산 + 변경가능 + 타입확장) 상속을 많이 할 수록 more OOP 이므로 OOP 프로그래밍 하려면 class에 final은 지양해야함
- data : 상수
- method : overriding 불가라는 뜻
Interface
- 다중 상속을 위한 프로그램 단위
- 모든 메소드는 abstract
- 객체의 타입으로 사용 (Flyer f = new Bird(); // Bird객체가 Flyer 타입, Flyer 인터페이스에서 정의된 메서드만 사용가능. Flyer 인터페이스에 정의되지 않은 Bird 클래스의 고유 메서드에는 접근 불가능)
(Bird b = new Bird(); // Bird 클래스의 모든 메서드와 필드에 접근 가능
- 스스로 객체 생성 불가
- 상속보다 interface 쓰는 게 more OOP. extends를 비울 수록 확장성이 있는 프로그램
String/StringBuffer/StringBuilder
// String은 불변 객체
String s1 = new String("java"); // 시간복잡도 O(n), 공간복잡도 상승, 객체를 새로 생성함
String s2 = "java"; // 시간복잡도 O(1), 공간복잡도 저하, 객체를 새로 생성하지 않음
//문자열 가공 시 (가변 객체)
StringBuffer s3 = new StringBuffer("java"); // 동시성 문제 있을 때 사용
StringBuilder s4 = new StringBuilder("java"); // 동시성 문제 없을 때 사용
String, StringBuffer, StringBuilder는 모두 final class (변경 불가. 상속할 수 없는 클래스 ==> 기능 확장 불가)
Wrapper class
primitive ==> class로 제공
자바의 컬렉션 클래스(ArrayList, HashMap 등)는 객체만 저장할 수 있기 때문에 기본 자료형을 객체로 변환하여 저장해야함.
Inner class
notepad 구현 예제
1) 초기코드
핸들러 클래스의 경우 값을 하나씩 전달 해주어야하는 불편함이 있음.
package notepad;
import java.awt.*;
public class Main {
public static void main(String[] args) {
Frame f=new Frame();
Button b1=new Button("전송1");
Panel p=new Panel();
TextField tf=new TextField(25);
TextArea ta=new TextArea();
f.add(ta);
f.add(p, BorderLayout.SOUTH);
p.add(tf);
p.add(b1);
MyButtonHandler btnHandler=new MyButtonHandler();
btnHandler.setTextField(tf);
btnHandler.setTextArea(ta);
b1.addActionListener(btnHandler);
tf.addActionListener(btnHandler);
f.setSize(400, 500);
f.setBackground(Color.GREEN);
f.setVisible(true);
}
}
package notepad;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class MyButtonHandler implements ActionListener{
TextField tf;
TextArea ta;
public void setTextField(TextField tf) {
this.tf=tf;
}
public void setTextArea(TextArea ta) {
this.ta=ta;
}
@Override
public void actionPerformed(ActionEvent e) {
// 하고 싶은 일
ta.append(tf.getText()+"\n");
tf.setText("");
}
}
2) 수정 코드 1
MyButtonHandler를 Main클래스 안에서 선언 ==> 값을 하나씩 전달하지 않아도 됨. 핸들러 내에서 this로 할당하지 않아도 됨.
package notepad;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Main {
TextField tf;
TextArea ta;
public Main() {
Frame f=new Frame();
Button b1=new Button("전송1");
Panel p=new Panel();
tf=new TextField(25);
ta=new TextArea();
f.add(ta);
f.add(p, BorderLayout.SOUTH);
p.add(tf);
p.add(b1);
MyButtonHandler btnHandler=new MyButtonHandler();
b1.addActionListener(btnHandler);
tf.addActionListener(btnHandler);
f.setSize(400, 500);
f.setBackground(Color.GREEN);
f.setVisible(true);
}
public static void main(String[] args) {
new Main();
}
public class MyButtonHandler implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
// 하고 싶은 일
ta.append(tf.getText()+"\n");
tf.setText("");
}
} //INNER CLASS
}// OUTER CLASS
3) 수정코드 2
MyFrameHandler 추가로 종료 버튼 동작하도록 수정
public class MyFrameHandler extends WindowAdapter{
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
4) anonymous inner class (local class)
MyButtonHandler와 WindowListener 핸들러를 Main메서드 안에서 익명 내부 클래스로 바꿈 ==> 코드 짧아짐
// 기존 코드 (Main 메서드 외부에서 선언)
public class MyButtonHandler implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
// 하고 싶은 일
ta.append(tf.getText()+"\n");
tf.setText("");
}
} //INNER CLASS
public class MyFrameHandler extends WindowAdapter{
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
// 수정 후 코드 (Main 메서드 내부에서 선언)
tf.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
// 하고 싶은 일
ta.append(tf.getText()+"\n");
tf.setText("");
}
});
f.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
lambda
anonymous class의 가독성을 위한 축약 표현 기법
코드 라인을 줄여주고, 복잡한 클래스를 작성할 필요 없이 기능 표현 가능.
// 기존 코드
tf.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
// 하고 싶은 일
ta.append(tf.getText()+"\n");
tf.setText("");
}
});
// 수정 코드
tf.addActionListener(
e -> {
// 하고 싶은 일
ta.append(tf.getText()+"\n");
tf.setText("");
}
);
Generics
제네릭은 타입 안정성을 보장.
homogeneous collection의 성능 개선을 위한 기법
homogeneous collection : 동일한 타입의 요소만을 포함하는 컬렉션 (ArrayList<Integer>와 같은 경우)
ArrayList<Object>에 String과 Integer를 혼합하여 저장할 수 있지만, ArrayList<Integer>는 오직 Integer만 저장할 수 있음. 이로 인해 타입 안정성 보장 및 성능 향상. 타입 exception을 따로 구현하지 않아도 됨.
package generic;
import java.awt.Button;
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
int []arr1= {1,2,3}; // homogeneous collection
String []arr2= {"hello","hi","bye"};// homogeneous collection
Object []arr3= new Object[3];//heterogeneous collection
arr3[0]="hello";
arr3[1]=new Test();
arr3[2]=1;
ArrayList<Integer> list=new ArrayList();//homogeneous collection
list.add(1);
list.add(new Integer(2));
list.add(3);
for (Integer i : list) {// no shadow effect
//if(object instanceof Integer) {
// Integer i=(Integer)object;
System.out.println(i.intValue());
//}
}
}
}
Comparable/Comparator
객체를 비교하고 정렬할 때 사용하는 인터페이스
Comparable : 객체가 자기 자신을 기준으로 정렬할 수 있을 때 사용. compareTo()메서드로 객체 비교
Comparator : 객체를 외부에서 기준을 정의하여 여러 기준으로 정렬할 수 있을 때 사용. compare()메서드로 객체 비교
package generic;
import java.awt.Button;
import java.util.ArrayList;
import java.util.Comparator;
public class Test {
public static void main(String[] args) {
int []arr1= {1,2,3}; // homogeneous collection
String []arr2= {"hello","hi","bye"};// homogeneous collection
Object []arr3= new Object[3];//heterogeneous collection
arr3[0]="hello";
arr3[1]=new Test();
arr3[2]=1;
ArrayList<Integer> list=new ArrayList();//homogeneous collection
list.add(1);
list.add(new Integer(20));
list.add(3);
System.out.println(list);
list.sort(( o1, o2) -> o1-o2 );
System.out.println(list);
}
}
과제 (첫 화면 구현)
'[LG 유플러스] 유레카 > Today I Learned' 카테고리의 다른 글
[TIL][02.13] 재귀, Serialization, 배열, Exception (0) | 2025.02.13 |
---|---|
[TIL][02.12] Generic, 와일드 카드, Collection, ArrayList, LinkedList, Hashset, TreeSet, HashMap (0) | 2025.02.12 |
[TIL][02.10] 배열, 상속, 다형성, abstract (0) | 2025.02.10 |
[TIL][02.07] String, Method, Arrays (0) | 2025.02.10 |
[TIL][02.06] JAVA, JVM, TYPE, Garbage Collection (0) | 2025.02.06 |