[Java] 1. JVM / JRE / JDK
1-1. JVM (Java Virtual Machine)
- 우리가 Java로 작성한 코드는 컴파일러를 통해
.class
확장자를 가진 바이너리(=바이트) 코드로 바뀐다. - 컴파일된 바이너리 코드는 운영체제(Mac,Window,IOS,Android)마다 다르게 인식한다.
- Java는 운영체제별 JVM을 제공하여, 컴파일된 코드가 운영체제에 상관없이 똑같은 동작을 낼 수 있도록 한다.
- 즉, JVM은 컴파일 코드를 읽고/검증하고/실행하여 운영체제가 변해도 똑같은 동작을 할 수 있게 돕는다.
1-2. JRE (Java Runtime Environment)
- 말그대로, 자바 코드의 실행 시 필요한 도구들을 갖춘 환경이다.
- JVM + 자바 프로그램 실행에 필요한 라이브러리 파일(system.out, 등...)으로 구성되어있다.
1-3. JDK (Java Development Kit)
- JRE + 개발을 위한 도구(컴파일러, 디버거, ...)
[Java] 2. 예외
자바는 예외처리도 예외에 관한 클래스를 상속받아 구현한다.
Throwable
이라는 클래스가 있고, 그 하위자식들로 예외를 표현한다.
2-1. 예외 기본
- Error : 컴퓨터나 JVM이 동작할 수 없는 크리티컬한 상황.
-
Exception : 그 외의 대부분 문제상황.
- RuntimeException : 프로그램 실행도중 발생 할 수 있는 상황에 사용됨.
- IOException : 파일을 읽고 쓰는 상황에서 발생 할 수 있는 상황에 사용됨.
- catch 는 이어서 사용하여, 다양한 예외를 잡을 수 있다. 단, 더 작은 범위의 Exception 부터 사용하여야, 더 많은 예외를 잡는 것이 가능해진다.
try{
검증 코드
}catch(작은범위의 에러){
예외 시 처리1
}catch(넓은범위의 에러){
예외 시 처리2
}
2-2. try-with-resource
입출력을 사용 할 때, 파일을 열고 닫는 행위를 해야한다.
이 때 의무적으로, close() 메소드를 호출하여 처리해야하는데, try-with-resource
방식을 사용하게 되면 try에 전달한 자원을 try실행이후 자동으로 close 해주면서, 효율적인 코드를 작성하는데 도움을 준다.
try-with-resource
방식은 closeable interface 를 implements 한다.
try(...1. 자원할당){
...2. 코드실행
}
...3. 자원 자동해제
catch(e){
...
}
catch(e){
...
}
2-3. 메소드에 예외처리를 전가하기
throws
키워드를 사용하여, 예외를 메소드 실행시점으로 전가 시킨다. 단, 해당 키워드를 통해서 정의한 메소드는 반드시, try-catch문을 이용하여 정의한 exception에 대한 예외처리를 반드시 해야한다.
public static String getString(String a) throws Exception_1, Exception_2 {
....
}
try{
getString("sdsada")
}catch(Exception_1 e){
...
}catch(Exception_2 e){
...
}
[Java] 3. Collection
자료구조를 표현하고 사용하기 위한 클래스의 집합.
3-1. ArrayList vs HashSet
- ArrayList는 순서가 보장됨, HashSet은 순서가 보장되지 않음.
3-2. ArrayDeque(Double-Ended Queue)
- Stack과 Queue의 기능을 모두 포함하면서 성능이 더 좋다.
- 하지만, Thread-Safe하지 않기에, 멀티쓰레드 환경에서는 문제가 있다.
- 그래서 pop(), push(), peek() 등에 synchronized를 이용해 ArrayDeque을 구현하면 된다.
- ArrayDeque의 push는 addFirst와 동일하게 동작한다.
[Java] 4. Generics
Collection 클래스를 Generics를 통해 컴파일타임에 타입체크해줌으로서, 프로그램의 안정성을 증대시켜준다.
4-1. 사용예들
<T> // Type
<E> //Element
<K> //Key
<V> //Value
<N> //Number
<R> //Result
[Java] 5. 람다와 스트림
5-1. 람다
- 식별자 없이 실행 가능한 함수.
- 코드가 간결해지지만, 익명함수기에 재사용성이 줄어든다는 단점이 있다.
- forEach, map, filter, ...
5-2. 스트림
- 데이터를 여러개 표현 할 수 있는 곳에는 흐름이 생기고, 그 흐름을 이용해서 조작을 하는 것이다.
- 데이터가 삭제되고, 수정되고, 들어오고 하면서 데이터가 유동적으로 변하게 된다. 이를 흐름이라 칭하는 것 같다.
- java8에서 적용되었다.
- 흐름내부에서만 변동되지, 흐름의 대상을 직접적으로 수정하지는 않는다.
- 한번닫힌 흐름은 재사용이 불가하다.
collect()
를 이용하여 스트림과정에서 return된 결과를 모아준다. 매개변수를 통해 collection타입도 변경가능하다.
[CS] 6. API(Application Programing Interface)
데이터를 주고받는 형식에 대한 약속(규약-Interface)
[Python] 7. set
set은 집합을 만들기 위한 개념으로서 합/교/차집합을 구하는 것이 가능하다.
set() & set() # 교집합
set() | set() # 합집합
set() - set() # 차집합
set은 중복을 없애준다. 단, 순서를 보장하지 않는다.
[Python] 8. 다양한 매개변수를 받는방법
def a(*args):
print(args) # (a,b,c,) 튜플형식으로 인자가 들어옴
def b(**kwargs):
print(kwargs) # {"a":1,"b":2, ...} 와 같은 딕셔너리 형태로 인자가 들어옴
[회고] 221108 : 왜 겁을 내는가
질문방에는 다양한 질문이 올라온다. 다양한 사람들이 다양한 답변을 한다. 컴퓨터전공 수강생들/개발을 좀 해본 수강생들/튜터님들/매니저님들.. 나는 다양한 답변이 올라오는 곳에서의 토론은 의식적으로 피한다. 왜그런지 곰곰하게 생각해보니 아래의 결론이 도출되었다.
- 내 의견이 틀리는 것이 무서워서
- 내 의견이 지적당하는게 두려워서
- 토론에 휘말리기 싫어서
- 내가 잘난척하는 느낌이 나는것이 싫어서
너무나도 명확하게 내가 고쳐야 할 점들이 도출되었다. 내가 봐 온 위대한 개발자들은 군중앞에서 말하고, 의견을 나누고, 토론하는 것을 즐겼다.
다만, 그게 틀릴지라도 틀린것에 반박할 수 있는 지식을 가지고 있었지만 말이다.
어쨋던, 난 너무 내 틀에 갖혀있다는 생각을 했다. 토론이 이뤄질 때, 비전공자 팀원들이 모여있는 방에 숨어 저건 맞다 저건아니다 하는 시시비비를 가리는 모습을 보면서 앞으로 나서지 못하고 뒤에서 의견을 내는 내가 한심하게 느껴졌다.
이건 아니다.
이건 성장할 수 없는 태도다.
왜 겁을 내는가.
변해야한다.
내 틀에서 벗어나야한다.
[다짐] 221109
- 상대방의 의견을 경청하기 / 무시하지 않기
- 적극적으로 질문하기
- 적극적으로 토론하기
- 적극적으로 잘난척하기(내가 토론을 할 수있는 것에 대해)
- 지속적으로 의문을 갖고 어떤 문제에 대해 파고들기