Day05. 자바 프로그래밍 기본
목차
자바 기본 문법
String
if (str1 == str2) // 주소값 비교
if (str1.equals(str2)) // 문자열 비교
new 키워드 유무에 따른 차이
- new 로 생성되면 무조건 객체를 새로 만든다 ex) String str1 = new String(”예시”);
- new 로 생성되지 않으면
- new 없이 생성된 것 중 값이 같은게 있는지 확인하고
- 같은게 있으면 그곳을 똑같이 가리킴
String은 불변/상수이다. ⇒ 값 변경 불가
String str = "kim";
str = "lee";
=을 기준으로 오른쪽이 먼저 일어난다. 따라서 “lee” 스트링(객체)가 생성되고 str이 가리키고 있던 “kim”을 끊은 뒤 “lee”를 가리킨다. 이때, 원래의 자원을 더이상 쓰지 않으면 gc(garbage collection)이 일어나서 메모리를 회수한다. 그런데 이 과정이 비효율적이므로 String을 자주 바꾸면 안된다. cf) Java Dosc > String
그래서 문자열을 자주 변경하거나 조작하는 용도로 사용하는 전용 클래스가 있다.
- StringBuilder(비동기. 일반적으로 많이 사용)
- StringBuffer(동기화 보장.)
메소드가 같아서 사용 방식이 같다.
.equals
Object에도 있는 메소드. String에 오버라이딩 되어 있다.
boolean **equals**(**Object** obj)
Object에서
- 인수로 전달된 객체와 주소값 비교
- ==와 같은 일을 한다. 그래서 굳이 쓰지 않음.
String에서
- 인수로 전달된 객체의 문자열과 비교
modifier
final ↔ abstract 반대의 개념이라 같이 쓸 일 없다
final
변수
- 지역, 전역 변수 앞에 올 수 있다.
- 변수 앞에 final이 오면 고정값이 된다.
- 값 변경 불가
- 관례상 대문자와 _로 표현
- 반드시 초기화해야 한다. (전역 변수도 초기화 해야 함. 자동 초기화 안됨! 명시적 초기화 또는 생성자에서)
- static final은 상수이다. (상수란, 누가 쓰든 같은 값이라는 것. 처음부터 값이 정해져 있음. 반드시 멤버 필드에서 명시적 초기화.)
- public static final PI = 3.14;
메소드
- method 앞에 오면 overriding 불가.
- public final void methodName() { }
클래스
- class 앞에 오면 상속 불가. (객체 생성은 가능)
- final class ClassName{ }
abstract
추상화 (↔ 구체화)
덜 된 코드. 미완성 상태.
누군가 구체화 하도록 하기 위한 용도로 사용된다.
변수 앞에 올 수 없음
메소드
- method 앞에 abstract 붙으면 선언부만 있고 구현부 없다. (기능 없다. 메소드에 바디가 없음.)
- public abstract void methodName(); ⇒ ;으로 끝난다
- 기능도 없는 메소드를 왜 만들지?
- ⇒ Sub Class에서 재정의 하기 위해
- abstract method를 가지고 있는 class는 반드시 abstract class로 선언해야 한다
클래스
- abstract class는 객체 생성 불가(new 안됨)
- 다른 class의 부모(Super)가 되기 위해 존재
- 상속 관계에 있을 때 SuperClass가 abstract method를 가지고 있으면 SubClass에서 abstract method를 재정의 해야 한다.
- 만약, 재정의 하지 않으면 SubClass는 abstract로 선언되어야 하며, 객체 생성을 할 수 없다.
상속 관계
- is a
- extends
- implements
- 상속과 유사한 기능을 한다
- 상속은 단일 상속. 이를 보완한다.
- 다중 상속 가능. 콤마(,)로 여러개 implement Interface1, Interface2 가능
- 상속 관계일 때 성립하는 모든 문법이 인터페이스에서도 성립
- class diagram에서 객체 상속 -> 인터페이스 구현 ・・>
- has a
- 부모의 멤버필드
- 인터페이스의 지역변수(필드, 메소드)
Interface
- class와 유사하지만 class가 아니다 ⇒ 상속X, 생성X
- interface를 구현(implements)하여 다중상속 같은 효과 얻음.
- interface의 모든 변수는 public static final이다. (상수)
- interface의 모든 method는 public abstract이다. ⇨ 기능X
- 위의 ⑶,⑷번으로 선언되어 있지 않더라도 무조건 interface 안의 변수는 상수, method는 abstract method이다. (그래서 만들때 굳이 적지 않음)
- interface는 생성 할 수 없지만 Type(자료형)으로 사용가능
- interface는 다른 interface를 상속(extends) 받을 수 있으나 class는 상속 받을 수 없다.
- class가 interface를 implements하게 되면 interface에 있는 모든 method 재정의 해야 한다(별 기능이 없더라도). 안 하면 abstract class로 선언되어야 한다.
- 만약, interface1가 interface0를 상속 받았고, interface1를 class가 implements 하면 interface0,1에 있는 모든 method class안에서 재정의 해야 한다.
버전 별 업데이트
- version 1.8부터 static, default 메소드 가 추가됨 (body가 있는 메소드)
- version 9
- interface에 private method
Collections
- 객체만 저장 가능 primitive(8가지) datatype x
- cf) auto-boxing/unboxing, wrapper class(첫 글자만 대문자)
- boxing 기본형→객체 unboxing 객체→기본형 / 근데 이게 자동으로!
- 자료구조 Collection 때문에 생김
- 자료구조 공간의 크기를 얼마든지 늘릴 수 있다.
- java.util.List, Set, Map
- Interface 이다!!
- 미리 implement 해둔 구현객체를 제공한다.
- 추가된 문법
- <E> 엘리먼트 타입 선언
- 아무렇게나 넣고 꺼내면 Object가 된다. 다 instanceof 할거야?
- cf) generic type
- <E> 엘리먼트 타입 선언
List
순서index 있고 중복 가능
구현객체 : ArrayList, Vector, LinkedList, …
이것들을 리스트라고 부를 수 있다. 각각의 장단점이 있다.
추가, 조회 → ArrayList
중간에 삽입,삭제 → LinkedList
Set
순서 없고 중복 불가
구현객체 : HashSet, TreeSet(element 정렬해줌)
Map
(Key, Value) 한 쌍으로 이루어지며 Key는 중복 불가, Value는 중복 가능
구현객체 : HashMap, Hashtable, TreeMap, Properties, …
.sort
Comparable vs Comparator
인터페이스라 메소드 전부 재정의 필요. (근데 한개임)
구현 방식 비슷하다.
return
음수 : 오른쪽이 크다 양수 : 왼쪽이 크다 0 : 같다
Comparable
- 자기자신과 매개변수를 비교
- 직접 객체가 구현해서 사용
- 한 가지 방법으로 고정됨
@Override
public int compareTo(Student st) {
// 10-2=8, 2-10=-8, 8-8=0
return num - st.getNum(); // 오름차순
}
Comparator
- 두 매개변수를 비교
- Collections.sort((1), (2)) (2)번째 인수로 comparator 넣어줌
- 여러번 불러서 구현 가능
import java.util.Comparator; // 임포트 필요
Collections.sort(sortedList, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
// 그럼 스트링은 어떻게 비교할까? 사전순 비교 해서 -1 0 +1
return o1.getAge() - o2.getAge(); // 오름차순
}
});