⚙️ backend/☕️ java

Day05. 자바 프로그래밍 기본

dev!n 2023. 7. 9. 14:24

목차

    자바 기본 문법

    String

    if (str1 == str2) // 주소값 비교
    if (str1.equals(str2)) // 문자열 비교
    

    new 키워드 유무에 따른 차이

    • new 로 생성되면 무조건 객체를 새로 만든다 ex) String str1 = new String(”예시”);
    • new 로 생성되지 않으면
      1. new 없이 생성된 것 중 값이 같은게 있는지 확인하고
      2. 같은게 있으면 그곳을 똑같이 가리킴

    String은 불변/상수이다. ⇒ 값 변경 불가

    String str = "kim";
    str = "lee";
    

    =을 기준으로 오른쪽이 먼저 일어난다. 따라서 “lee” 스트링(객체)가 생성되고 str이 가리키고 있던 “kim”을 끊은 뒤 “lee”를 가리킨다. 이때, 원래의 자원을 더이상 쓰지 않으면 gc(garbage collection)이 일어나서 메모리를 회수한다. 그런데 이 과정이 비효율적이므로 String을 자주 바꾸면 안된다. cf) Java Dosc > String

    그래서 문자열을 자주 변경하거나 조작하는 용도로 사용하는 전용 클래스가 있다.

    메소드가 같아서 사용 방식이 같다.

    .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로 선언되어야 하며, 객체 생성을 할 수 없다.
      abstract class A {}

    상속 관계

    1. is a
      1. extends
      2. implements
        1. 상속과 유사한 기능을 한다
        2. 상속은 단일 상속. 이를 보완한다.
        3. 다중 상속 가능. 콤마(,)로 여러개 implement Interface1, Interface2 가능
        4. 상속 관계일 때 성립하는 모든 문법이 인터페이스에서도 성립
        5. class diagram에서 객체 상속 -> 인터페이스 구현 ・・>
    2. has a
      1. 부모의 멤버필드
      2. 인터페이스의 지역변수(필드, 메소드)

    Interface

    1. class와 유사하지만 class가 아니다 ⇒ 상속X, 생성X
    2. interface를 구현(implements)하여 다중상속 같은 효과 얻음.
    3. interface의 모든 변수는 public static final이다. (상수)
    4. interface의 모든 method는 public abstract이다. ⇨ 기능X
    5. 위의 ⑶,⑷번으로 선언되어 있지 않더라도 무조건 interface 안의 변수는 상수, method는 abstract method이다. (그래서 만들때 굳이 적지 않음)
    6. interface는 생성 할 수 없지만 Type(자료형)으로 사용가능
    7. interface는 다른 interface를 상속(extends) 받을 수 있으나 class는 상속 받을 수 없다.
    8. class가 interface를 implements하게 되면 interface에 있는 모든 method 재정의 해야 한다(별 기능이 없더라도). 안 하면 abstract class로 선언되어야 한다.
    9. 만약, 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

    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();	// 오름차순
                }
            });