목록JAVA (9)
Jun's Development Journey

1. 중첩 클래스 및 중첩 인터페이스 - 클래스 내부에 선언한 클래스를 말하는데, 중첩 클래스를 사용하면 두 클래스의 멤버들을 서로 쉽게 접근할 수 있다는 장점과 외부에는 불필요한 관계 클래스를 감춤으로써 코드의 복잡성을 줄일 수 있다. - 클래스가 여러 클래스와 관계를 맺는 경우에는 독립적으로 선언하는 것이 좋으나, 특정 클래스와 관계를 맺을 경우엔 관계 클래스를 내부에 선언하는 것이 좋다. - 클래스 내부에 선언되는 인터페이스를 중첩 인터페이스라고 한다. 인터페이스를 내부에 선언하는 이유는 해당 클래스와 긴밀한 관계를 맺는 구현 클래스를 만들기 위함이다. - 중첩 인터페이스는 주로 UI 프로그래밍에서 이벤트 처리 목적으로 많이 활용된다. 1) 중첩 클래스 - 중첩 클래스는 클래스 내부에 선언되는 위치..

1. 인터페이스 역할 및 사용 이유 1-1) 역할 - 객체의 사용 방법을 정의한 타입이다. 인터페이스는 객체의 교환성을 높여주기 때문에 다형성을 구현하는 매우 중요한 역할을 한다. - 자바 8의 람다식은 함수적 인터페이스의 구현 객체를 생성하기 때문에 더욱 중요해졌다. - 인터페이스는 개발 코드와 객체가 서로 통신하는 접점 역할을 한다. 개발 코드가 인터페이스의 메소드를 호출하면 인터페이스는 객체의 메소드를 호출한다. 그렇기 때문에 개발 코드는 객체의 내부 구조를 알 필요가 없고, 인터페이스의 메소드만 알면 된다. 1-2) 사용 이유 - 개발 코드가 직접 객체의 메소드를 호출하면 간단한데 왜 중간에 인터페이스를 두냐면, 개발 코드를 수정하지 않고 사용하는 객체를 변경할 수 있도록 하기 위함이다. - 인터..

1. 스레드 그룹 - 관련된 스레드를 묶어서 관리할 목적으로 이용된다. - JVM이 실행되면 system 스레드 그룹을 만들고, JVM 운영에 필요한 스레드들을 생성해서 system 스레드 그룹에 포함시킨다. 그리고 system의 하위 스레드 그룹으로 main을 만들고, 메인 스레드를 main 스레드 그룹에 포함시킨다. - 스레드는 반드시 하나의 스레드 그룹에 포함되는데, 명시적으로 스레드 그룹에 포함시키지 않으면 기본적으로 자신을 생성한 스레드와 같은 그룹에 속하게 된다. - ex - Finalizer 스레드를 비롯한 일부 스레드들이 system 그룹에 속하고, main 스레드는 system 그룹의 하위 그룹인 main에 속해있다. - main 스레드가 실행시킨 AutoSaveThread는 main 스..

1. 메인 스레드 - 모든 자바 어플리케이션은 메인 스레드가 main() 메소드를 실행하면서 시작된다. - main() 메소드의 첫 코드부터 순차적으로 실행하고, 마지막 코드를 실행하거나 return문을 만나면 실행이 종료된다.ss 2. 스레드 우선순위 - 멀티 스레드는 동시성과 병렬성으로 실행되기 때문에 이 용어들에 대해 정확히 이해하는 것이 중요하다. - 동시성은 멀티 작업을 위해 하나의 코어에서 멀티 스레드가 번갈아가며 실행하는 성질이다. - 병렬성은 멀티 작업을 위해 멀티 코어에서 개별 스레드를 동시에 실행하는 성질이다. - 싱글 코어 CPU를 이용한 멀티 스레드 작업은 병렬적으로 실행되는 것처럼 보이지만, 사실은 번갈아가며 실행하는 동시성 작업이다. 번갈아 실행하는 것이 워낙 빠르다보니 병렬성으..

1. 스트림 - 데이터를 운반하는데 사용되는 연결통로 - 입력 스트림, 출력 스트림 총 2개의 스트림이 필요하다. 1-1) 바이트 기반 스트림(InputStream, OutputStream) - 모든 바이트 기반 스트림의 조상 - 대표적 메소드 1) InputStream - read() : 1 바이트를 읽어온다. 더 이상 읽어올 데이터가 없다면 -1을 반환한다. - close() : 스트림을 닫음으로써 사용하고 있던 자원을 반환한다. 2) OutputStream - write(int b) : 주어진 값을 출력소스에 쓴다. - flush() : 스트림의 버퍼에 있는 모든 내용을 출력소스에 쓴다. - close() : 입력소스를 닫음으로써 사용하던 자원을 반환한다. 1-1-1) ByteArrayInputSt..

1. 다른 생성자 호출 - 생성자 오버로딩이 많아질 경우 생성자 간의 중복된 코드가 발생할 수 있다. - 이 경우엔 필드 초기화 내용은 한 생성자에만 집중적으로 작성하고, 나머지 생성자는 초기화 내용을 가지고 있는 생성자를 호출하는 방식으로 개선할 수 있다. ex) 2. 정적 멤버와 static - 클래스에 고정된 멤버로서, 객체를 생성하지 않고 사용할 수 있는 필드와 메소드이다. - 필드 및 메소드 선언 시 static 키워드를 추가적으로 붙여주면 된다. - 정적 필드 및 메소드는 클래스에 고정된 멤버이기에 클래스별로 관리된다. - 인스턴스 필드, 정적필드 중 어느 것으로 선언할 것인가는 객체마다 가지고 있어야 하는 멤버는 인스턴스, 공용적인 데이터면 정적 필드로 선언하는 것이 좋다. - 예를 들어 원..

1. 커맨드 라인 입력 1-1) main 메소드 - 자바 클래스로 프로그램을 실행하면 JVM은 길이가 0인 String 배열을 먼저 생성하고, main 매소드 호출할 때 매개값으로 전달한다. - main() 메소드는 String[] args 매개 변수를 통해서 커맨드 라인에서 입력된 데이터의 수와 입력된 데이터를 알 수 있다. - 메인 메소드의 파라미터는 cmd를 통해 입력받는다. - 해당 java 파일 실행 후 class 파일 생성 -> cmd로 클래스 파일 존재하는 폴더로 이동 -> java 클래스명 문자열1 문자열2 ... 형태로 문자열 사이를 공백으로 구분하여 입력 ex) 코드 CMD 1-2) cmd로 파일 실행 빈도가 적고 인자값 전달할 일이 별로 없으니 필요없다? - 안된다. 꼭 String ..

1. 오버플로우 탐지 - 연산 후의 산출값이 산출 타입으로 표현이 가능한지 살펴봐야 한다. - 산출 타입으로 표현 불가 시 쓰레기값을 얻을 수 있기 때문이다. - 아래 예시에서 올바른 값을 얻기 위해선 x, y 중 최소 하나라도 long 타입이 되어야 하고, z 변수는 long 타입이어야 한다. 2. 비교 연산자(=, ==, !=) - 피연산자가 char 타입이면 유니코드 값으로 비교 연산을 한다. - 예를 들어 'A' = 65, 'B' = 66이므로 65와 66을 비교한다. - 비교 연산자에서도 연산을 수행하기 전에 타입 변환을 통해 피연산자의 타입을 일치시킨다. - 예를 들어 'A' == 65는 'A'가 65로 된 다음 비교, 3 == 3.0은 3을 보다 큰 타입인 3.0으로 변환 후 비교한다. 3...