객체의 toString()을 오버라이딩하면 객체만 출력하는 메소드를 재정의할 수 있다.
class A {
private int i = "안녕?"
public A() {}
public String toString(){
return i;
}
public static void main(String[] args) {
A a = new A();
System.out.println( a ); // 출력결과 : "안녕?"
}
}
String은 상수이다!! -> 값변경이 불가
따라서, StringBuilder, StringBuffer를 이용하여 String을 handle한다.
// String을 계속 더해주면, 가비지 콜렉션이 계속 발생한다.
String str = "A"
str += "B";
// StringBuilder를 사용하여 가비지 콜렉션이 계속 발생하는 단점을 없앤다.
StringBuilder builder = new StringBuilder();
builder.append("A");
builder.append("B");
① equals method는 Object class에서 정의되어 String등의 여러 class에서 Overloading(재정의)되어 있다.
② primitiveType은 ==으로 비교하면 값을 비교한다.
③ ObjerctType은 ==으로 비교하면 주소값을 비교한다.
④ Objerct class의 equals는 ==과 같은 역할을 한다. (주소값 비교)
⑤ String class의 equals는 ==과 다른 역할을 한다. (값 비교)
package day05;
public class FinalKeywordExam {
// final 필드
final int i; // 반드시 초기화 필수, 생성자에서 초기화 가능
// 상수 필드
static final int J = 10; // 반드시 초기화 필수, 생성자에서 초기화 불가능
int k;
public FinalKeywordExam() {
i = 50; // final 필드를 생성자를 이용해서 초기화 할 수 있다.
}
public FinalKeywordExam(int value) {
i = value; // final 필드를 생성자를 이용해서 초기화 할 수 있다.
}
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
메소드
- 메소드 앞에 오면 overriding(재정의) 불가
클래스
- 클래스 앞에 오면 상속 불가 (객체 생성은 가능)
변수
메소드
클래스
package day05;
public class AbstractKeywordExam {
public static void main(String[] args) {
Remote re = new LgRemote();
re.on();
re = new SamsungRemote();
re.on();
}
}
abstract class Remote{
abstract void on();
}
class LgRemote extends Remote{
void on() {
System.out.println("LgRemote on");
};
}
class SamsungRemote extends Remote{
void on() {
System.out.println("Samsung on");
};
}
① class와 유사하지만 class가 아니다 ⇨ 상속X, 생성X
ex) interface A{ }
② interface를 구현(implements)하여 다중상속 같은 효과 얻음
③ interface의 모든 변수는 public static final이다 (상수- 변하지 않는다)
④ interface의 모든 method는 public abstract이다 ⇨ 기능X
⑤ 위의 ③,④번으로 선언되어 있지 않더라도 무조건 interface 안의 변수는 상수, method는 abstract method이다
⑥ interface는 생성 할 수 없지만 Type(자료형)으로 사용가능
⑦ interface는 다른 interface를 상속 받을 수 있으나 class는 상속 받을 수 없다
⑧ class가 interface를 implements하게 되면 interface에 있는 모든 method 재정의해야 한다. 안 하면 abstract class로 선언되어야 한다
⑨ 만약, interface가 interface를 상속 받았고, 서브 interface를 class가 implements 하면 서브, 슈퍼 interface에 있는 모든 method class안에서 재정의 해야 한다
package day05;
interface A {
// 필드 public static final
int i = 0; // 반드시 초기화 필수
// 메소드 public abstract
void aa(); // {body}가 없어야 함
abstract void bb();
}
interface B {
int cc();
String dd(int i);
}
class C {
public void test() {};
}
class Test extends C implements A, B { // Test is a A, B, C 성립
// A의 abstract void Override
@Override
public void aa() {
}
@Override
public void bb() {
}
// B의 abstract void Override
@Override
public int cc() {
return 0;
}
@Override
public String dd(int i) {
return null;
}
}
public class InterfaceExam {
public static void main(String[] args) {
// A a = new A(); 인터페이스는 생성 불가
// 다형성
A a = new Test();
B b = new Test();
C c = new Test();
}
}
데이터를 저장하는 구조
1) List : 순서(index) 있고 중복이 가능하다.
구현객체 - ArrayList, Vector, LinkedList,....
2) Set : 순서가 없다, 중복안됨.
구현객체 - HashSet, TreeSet : element를 정렬해준다!!
3) Map : key와 value의 한쌍으로 이루어지며, key는 중복안되고 value는 중복가능하다
구현객체 - HashMap, Hashtable, TreeMap, Properties...
1) 추가
~.add(Object obj);
2) 가져오기
Object obj = ~.get(int index);
3) 저장된 객체의 개수
int size = ~.size();
4) 제거
remove(int index); // index는 0부터 시작
remove(Object obj);
package day05;
import java.util.ArrayList;
public class ListExam extends ArrayList<Integer> {
public ListExam() {
super(6);
// 추가
super.add(3);
this.add(5);
add(1);
super.add(7);
// 출력
System.out.println("저장된 개수 : " + super.size()); // 저장된 개수 : 4
for(int i=0; i<super.size(); i++) {
// 저장된 데이터 조회
int num = super.get(i);
System.out.print(num + " ,"); // 3 ,5 ,1 ,7 ,
}
// 제거
super.remove(2); // index가 2번지, 즉 3번째 객체를 제거
System.out.println("\n제거 후 저장된 개수 : " + super.size()); // 제거 후 저장된 개수 : 3
// Collection은 Object의 toString을 Overriding해서 주소값이 아닌 내용물이 출력한다.
System.out.println(this); // [3,5,7]
}
public static void main(String[] args) {
new ListExam();
}
}
package day05;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ListExam2{
List<Integer> list = new ArrayList<Integer>(6);
public ListExam2() {
// 추가
list.add(3);
list.add(5);
list.add(1);
list.add(7);
list.add(1);
list.add(2);
// 출력
System.out.println("저장된 개수 : " + list.size()); // 저장된 개수 : 4
for(int i=0; i<list.size(); i++) {
// 저장된 데이터 조회
int num = list.get(i);
System.out.print(num + " ,"); // 3 ,5 ,1 ,7 ,
}
// 제거
list.remove(2); // index가 2번지, 즉 3번째 객체를 제거
System.out.println("\n제거 후 저장된 개수 : " + list.size()); // 제거 후 저장된 개수 : 3
System.out.println(list); // 주소
// 정렬
Collections.sort(list);
Collections.sort(list, null);
System.out.println("정렬 후 : " + list); // 오름차순 정렬
}
public static void main(String[] args) {
new ListExam2();
}
}
기본형을 객체로 변환해주는 전용클래스
Collection의 generic type에 들어가려면 객체여야 하므로 기본형을 객체로 변환해주는 WapperClass를 넣는다.
자바에서는 기본형과 WapperClass 사이에서 AutoBoxing, Unboxing이 일어난다.
Integer i = 5; // AutoBoxing
int j = new Integer(4); // Unboxing
Interface Comparable<T>
: int compareTo(T o)
Parameters(인수):
o - 비교할 대상.
Returns:
음수이면 인수가 크다.
0이면 같다.
양수이면 자신이 크다.
쉽게 말해 (자신 - 인수)가 결과
Interface Comparator<T>
: 메소드가 많지만 대부분 static, default
: int compare(T o1, T o2)
Parameters:
o1 - the first object to be compared.
o2 - the second object to be compared.
Returns:
o1 - o2 => 오름차순
o2 - o1 => 내림차순