즐거운 주말!
개발자 형님의 가족과 함께 식사하고, 알고리즘 문제 풀 때 옆에서 코칭도 받았다.
아가가 너무 귀여웠다... 자주 놀러오면 좋겠다.
내가 무얼 알고 무엇을 모르는지 확실히 파악되지 않았고,
개념이 튼실하게 잡혀있어야 한다고 생각하여 주말을 활용하여 자바 강의자료를 복습해보며 정리했다.
모르거나 아 그래서 그랬구나! 라고 생각했던 것들만 정리하니 내가 그래도 성장을 하긴 했구나... 라는게 느껴진다.
자바의 원리를 '이것이 자바다'를 통해 더 학습해볼 것.
continue 명령이 있다는걸 기억해놓자..! 알고리즘 할 때 사용.
• List : ArrayList, LinkedList (List=Interface, ArrayList=Class) • Stack • Queue • Set: HashSet, TreeSet, LinkedHashSet • Map: HashMap(중복x, 순서x, key값 null O), TreeMap(key값 기준으로 오름차순정렬)
클래스=필드+생성자+메서드
클래스 멤버로 만들기 위해서는 static 키워드!
객체가 인스턴스화 할 때마다 객체의 메서드들은 인스턴스에 포함되어 매번 생성이 될까요?
- 그렇지 않습니다. 매번 저장한다면 중복 저장으로 인해 메모리 효율이 매우 떨어지기 때문에 메서드는 메서드 영역에 두고서 모든 인스턴스들이 공유해서 사용합니다.
- 대신 무조건 객체를 생성 즉, 인스턴스를 통해서만 메서드가 사용될 수 있도록 제한을 걸어둔 것입니다.
아하 이래서 생성자 호출로 객체가 없어도..!!!
• 지역변수 : 메서드 내부에 선언한 변수를 의미 (메서드 종료시 사라짐)
• final : 일반적으로 상수는 대문자로 작성하는 것이 관례. (static+final 로도 많이 사용됨)
• this: 객체 즉, 인스턴스 자신을 표현하는 키워드 (객체 내부 생성자 및 메서드에서 객체 내부 멤버에 접근하기 위해 사용)
• this(…): 객체 즉, 인스턴스 자신의 생성자를 호출하는 키워드 (객체 내부 생성자 및 메서드에서 해당 객체의 생성자를 호출하기 위해 사용)
-> this() 로 다른 생성자를 호출할 때: 해당 생성자의 첫 줄에 작성되어야 함.
- final 클래스: 상속 할 수 없는 클래스가 됨
- final 메서드: 오버라이딩 불가
- Object 클래스는 Java 내 모든 클래스들의 최상위 부모 클래스
2. 접근제어자 좁은 범위 안되는 이유: 다형성을 생각해보라. 메소드를 더 좁은 범위로 오버라이딩 한다면 클라이언트는 상속받은 클래스를 반환 받을 땐 해당 메소드를 호출하지 못함. 반면에 부모 클래스를 반환받으면 호출 가능해지는 기이한 현상이 발생함.
- super : 부모 클래스의 멤버를 참조할 수 있는 키워드 (객체 내부 생성자 및 메서드에서 부모 클래스의 멤버에 접근하기 위해 사용)
- super(…) : 부모 클래스의 생성자를 호출할 수 있는 키워드 (객체 내부 생성자 및 메서드에서 해당 객체의 부모 클래스의 생성자를 호출하기 위해 사용), 이것도 가장 첫줄에 호출.
- 부모타입 변수 = 자식타입객체; : 자동으로 부모타입으로 변환 -> 부모에 없는 자식 메서드 사용 불가. 단, 메서드 호출시 오버라이딩 된 자식의 메서드가 호출됨.
- 자식타입객체가 부모타입으로 자동 타입변환된 후 다시 자식타입으로 변환될 때 만 강제 타입변환이 가능
(부모타입 변수로는 자식타입객체의 고유한 멤버를 사용할 수 없기 때문에 사용이 필요한 경우가 생겼을 때 강제 타입변환을 사용)
- 추상 클래스: 상속받은 클래스에서 추상 클래스의 추상 메서드는 반드시 오버라이딩 되어야 함 (@Override) -> 하나일때는 생략된댓나?? 아무튼 생략 가능하지만 명시적으로 작성하는게 좋음.
이게 들어가 있다는 것만 알아두자! 다들 생략해서 쓰니....
- 인터페이스에서는 static 메서드 선언이 가능함.
- 인터페이스의 추상 메서드는 구현될 때 반드시 오버라이딩 되어야 한다.
(만약 인터페이스의 추상 메서드를 일부만 구현해야 한다면 해당 클래스를 추상 클래스로 변경)- 인터페이스는 implements 키워드로 상속받지만, interface끼리는 extends!
- 인터페이스는 다중 상속 가능
인터페이스의 모든 method는 public abstract이기 때문에, 인터페이스에 메서드를 추가하려면, 구현하는 모든 클래스에서 해당 메서드를 구현하는 코드를 일일이 다 써줘야한다.
이걸 해결하여 인터페이스에 자유롭게 새로운 메서드를 추가하고자 만들었음.