D-1) 사전과제 벼락치기중
개발자는 밀려드는 여러 가지 업무를 효율적으로 처리할 줄도 알아야 하는 법
그런가?
강의 중 중요했던 내용)
1. JVM 메모리의 4가지 영역
2. 상속 시, 부모의 영역은 부모의 생성자를 super()로 호출해 초기화하는 것이 바람직하다
3. 클래스 설계 시 소스파일을 넘겨주지 않고 class 파일만 넘겨주는 경우가 많고 이 경우 내부에 뭐가 있는지 모르기 때문에 동작 측면 에서, 인터페이스를 같이 만들어 넘겨주는 게 바람직. 그래서 업캐스팅(부모가 자식을 가리킴)한다
업캐스팅하면 동적 바인딩 된다 메서드가 재정의되고 실행시점에 알 수 있다. 다형성과 연관됨 / 반면에 정적바인딩은 컴파일 시점에 결정되는 것
4. 자식으로 부모를 가리킬 땐 부모를 강제 형변환 해줘야 함(다운캐스팅) 이때 강제 형변환은 참조 연산자보다 우선순위 낮음
5. instanceof 를 이용해 타입을 검사할 수 있다. bool 리턴
6. 상위타입의 배열(다형성배열)을 생성해 서로 다른 타입의 자식들을 배열에 넣을 수 있다
7. 추상 클래스 내에 구현 메서드를 사용할 경우 하위 클래스가 오동작할수 있음 -> 구현 메서드를 사용하지 않는 경우를 인터페이스라고 함
정의 시 class 대신 interface라는 키워드를, 상속시 extends 대신 implements라는 키워드를 사용한다. 다형성 100퍼 보장
인터페이스 내부엔 final static 이라는 키워드의 변수를 넣을 수 있고, 그건 상수가 됨
8. C++ C#은 다중상속을 지원함. 자바는 단일상속만 지원하지만, 다중상속 비슷한 게 가능함. 인터페이스는 여러개 상속 가능
9. 모든 클래스는 Object 클래스를 상속받은 것이므로, Object를 다형성 인수로 사용 가능 -> 반드시 다운캐스팅 발생
Object.toString() 메서드는 그 객체의 주소번지를 문자열로 리턴하는 기능임 그렇지만 우리는 거의 이걸 재정의해서 사용할 것임
1. API는 우리가 사용할 수 있는 클래스임
2. Maven이라고 자바 프로젝트 관리 도구가 있음. mvnrepository 사이트에서 외부 API를 다운받아 사용 가능. 다운받은 외부 API는 file-project structure에 들어가서 추가해주면 된다.
3. Gson API는 객체를 json 형식의 string으로 변환해주는 또는 그 반대의 API임
toJson / fromJson 메서드를 쓰면 된다
4. 배열의 인덱스 개수는 생성할 때 정해지는데, 예제에선 이걸 늘리기 위해서 Arrays.copyOf(원래배열,새로운사이즈) 를 사용
5. 자바에서 지원해주는 ArrayList클래스가 있음. <> 꺽쇠를 이용해 제네릭 타입을 지정해 주면 더 좋음. API를 이용해 배열처럼 사용하는 예시임. 도큐먼트를 잘 찾아 봐라
1. 문자열 생성 방법은 2가지가 있음.
new 키워드로 생성 -> 힙에 생성된 객체가 된다 /// "문자열문자열" 로 생성 -> 객체가 리터럴 풀에 생성되지만, 얘는 재활용된다.(이미 있다면 이미 있는 객체를 가리킨다)
2. 문자열 비교 시 == 를 쓰지 말고 메서드를 이용해야 함. equals() compareTo()
문자열에서 특정 문자열의 인덱스를 찾는 메서드는 indexOf()이다
3. 문자열을 쉼표로 토큰화할 경우(구분자를 이용해 나눌 경우) 파이썬처럼 split(",")으로 나눠줄 수 있고, 이 경우 분리된 문자열을 배열을 이용해 받아주어야 한다.
정규표현식을 이용한 토큰화도 가능하다. 예시로 \s+ 을 이용해, 한개 이상의 공백문자를 이용한 토큰화를 보여주었다. 정규표현식에 대한 공부는 다른 참고자료를 이용하는 게 좋을 것 같고, 언젠가 필요할 듯
https://ko.wikipedia.org/wiki/%EC%A0%95%EA%B7%9C_%ED%91%9C%ED%98%84%EC%8B%9D
정규 표현식 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 노란색 강조 부분은 다음 정규식을 사용했을 때 매치된 것이다. 스티븐 클레이니는 정규 표현식의 개념을 설립한 공로자이다. 정규 표현식(正規表現式, 영어: r
ko.wikipedia.org
1. 자바 인터페이스를 이용해, 다른 벤더(회사) 들이 API를 만들어 사용하는 기법이 인터페이스 기반 프로그래밍임. 자바 개발자들도 편하고 벤더들도 편하다?
하위 클래스의 자세한 내부 동작을 모르는데도, 인터페이스를 이용해 사용할 수 있다.(느슨한 연결)
2. 데이터베이스와 자바를 연결하기 위해 Driver을 사용한다. (벤더들이 자기 데이터베이스 접속에 필요한 동작을 만들어 배포하는 API) 드라이버의 인터페이스는 자바에서 제공하고, 벤더의 구현 클래스를 오버라이딩해 사용. 드라이버를 구체적으로는 JDBC 드라이버라고 함
3. JDBC 프로그래밍이란, java database connectivity이고, DB와의 연결을 위해선 벤더들이 제공하는 DB접속 URL과 URL형식, 유저네임, 패스워드를 알아야 함
1. Collection Framework API란, 자바에서 제공하는 것 중 중요하고 많이 다루는 것
자바에서 제공하는 데이터 구조인 collection을 표현하는 인터페이스와 클래스의 모음
콜렉션에는 객체나 스트링을 집어넣음. 기본 자료형은 집어넣을수가 없음. 기본 자료형을 객체 자료형으로 바꾸면 넣을 수 있음
2. Wrapper 클래스란 기본 자료형을 객체로 다루기 위한 포장 클래스임. 사용 시 박싱과 언박싱이 이루어진다. 자료형의 첫글자를 대문자로 써버리면 된다
박싱 : 기본자료형을 객체로 / 언박싱 : 객체를 기본 자료형으로
오토박싱 / 오토언박싱이 되므로 크게 신경쓸 부분 없음
3. 숫자형 문자열을 정수로 바꾸기 위해 Integer.parseInt() 함수를 사용
정수를 문자열로 바꾸기 위해선 String.valueOf()함수를 사용하거나, "" + 정수를 사용해도 됨
4. 자바 해쉬셋 셋 맵 해쉬맵은 보통 put get remove으로 입출력함 C++이랑 대강 비슷함
1. 제네릭이란, 데이터타입을 일반화하는 것. 런타임에 결정됨->재사용성 향상. 여러개 넣어도 됨. 제네릭으로 뭘 넣을지를 제한할 수도 있음. T extends Number 라고 하면, T에는 숫자만 들어갈 수 있다
2. 함수형 인터페이스(람다식)은, 함수를 간결하게 쓰기 위한 익명함수의 한 형태임. 단 하나의 추상 메서드를 가진 인터페이스이다.
3. 일반적으로 인터페이스는 객체를 생성할 수 없으나, 객체를 생성하는척? 하고 바로 중괄호 열어서 안에 내용을 넣어버리면 익명클래스가 된다.
4. 함수형 인터페이스를 사용하는 이유 5가지 :
람다 표현식 지원 / 메서드 참조 / Stream API와의 통합 / 병렬 프로그래밍 / 코드 재사용
5. 람다식 쓰는법 : (매개변수들) -> {표현}. 람다 표현식과 인터페이스를 적절히 사용하면, 람다 표현식을 함수의 인자로 사용해 유연하게 처리할 수 있음.
6. 스트림은 병렬처리를 위한 API. 스트림은 데이터의 통로,흐름으로 생각하면 됨. Arrays.stream(배열)
스트림에는 중간연산/최종연산이 있으며, 중간연산은 스트림을 다른 스트림으로 반환(변환 필터 정렬..)
--> 스트림을 이용한 병렬처리는 그렇지 않은 경우보다 얼마나 빠른가?
https://velog.io/@injoon2019/%EC%8A%A4%ED%8A%B8%EB%A6%BC%EC%9D%80-%ED%95%AD%EC%83%81-%EC%A2%8B%EC%9D%84%EA%B9%8C
스트림은 항상 좋을까?
https://homoefficio.github.io/2016/06/26/for-loop-%EB%A5%BC-Stream-forEach-%EB%A1%9C-%EB%B0%94%EA%BE%B8%EC%A7%80-%EB%A7%90%EC%95%84%EC%95%BC-%ED%
velog.io
요약 ) 일반적인 경우 stream을 사용하는 것이 for loop보다 느리다. for loop는 컴파일러의 최적화가 훨씬 잘 되어 있다
그렇지만 원소의 개수가 적어지거나, 원소의 순회 비용보다 그 계산비용의 비중이 커진다면, 별 차이 없음
다른 글을 참고한 결과 스트림을 이용하는 상황은
1) 가독성 향상을 위해 / 2) 스트림의 단순 로직이 유용한 경우에
추가로, 병렬처리하면 무조건 빠르겠지~~ 이것도 아님. 병렬처리를 위해선 공유자원에 대한 관리가 이루어져야 하기 때문에 이에 대한 오버헤드가 발생하기 때문이다.