본문 바로가기
반응형

IT 개인 공부/Java38

[Java] 컬렉션 팩토리 : of Java에서 소수의 데이터를 가지는 고정된 크기의 리스트를 선언하려면 어떻게 해야 할까? 예를 들어 1, 2, 3 정수형 데이터를 가지는 리스트를 선언할 경우 다음과 같이 리스트 객체를 선언 후 add() 메서드를 통해 정수형 데이터를 입력해줄 것이다. List list = new ArrayList(); list.add(1); list.add(2); list.add(3); 하지만 이 방법은 데이터마다 add() 메서드를 타이핑해야 하는 번거로움이 존재하며 선언된 리스트는 고정된 크기의 리스트가 아니다. 이는 Arrays.asList() 팩토리 메서드를 이용하면 코드를 더욱 간단하게 줄일 수 있으며 고정된 크기의 리스트가 보장된다. List list = Arrays.asList(1, 2, 3); 실제로 l.. 2021. 9. 26.
[Java] 상속(Inheritance) vs 위임(Delegation) 객체지향 프로그래밍에서 서로 연관된 객체들의 관계를 표현할 때 상속(Inheritance)과 위임(Delegation) 관계로 많이 표현한다. 디자인 패턴을 공부해보면 이들을 활용함으로써 보다 객체지향적인 설계가 가능해지는 장점이 있다. 하지만 이들은 각각 장단점이 존재하며 사용해야 하는 상황이 다르기 때문에 무분별하게 남용하게 되면 클래스 간의 결합도가 강해 지거나 의존성이 높아지는 등 오히려 설계에 어려움이 생기게 될 수도 있다. 따라서 이번 기회에 이들의 장단점과 차이점, 언제 사용해야 하는지에 대해서 알아보도록 하자. 상속(Inheritance) 상속은 is a 관계로 extends 키워드를 통해 부모의 속성들을 자식이 물려받아서 사용할 수 있도록 해주는 관계이다. 부모의 속성을 물려받기 때문에 .. 2021. 8. 22.
[Java] Java에 포인터가 없는 이유 - 포인터(Pointer) vs 참조(Reference) C나 C++ 에는 포인터라는 개념이 존재하지만 Java에는 포인터라는 개념을 사용하지 않는다. 비슷한 개념으로 참조라는 것을 사용한다. 그렇다면 왜 Java에는 포인터가 존재하지 않을까? 그전에 포인터(Pointer)와 참조(Reference)의 차이를 간단하게 알고 넘어가자. 포인터, 참조 모두 주소를 통해 원본 데이터에 접근하는 공통 기능을 가진다. 다만, 포인터는 메모리를 직접 핸들링할 수 있지만 참조는 메모리를 직접 핸들링할 수 없다는 차이점이 존재한다. 포인터는 주소 값을 임의의 메모리 주소로 변경할 수 있다. 만약 개발자가 실수로 주소 값을 변경해버리면 segment fault 같은 문제가 발생할 가능성이 생기게 된다. 하지만 참조는 직접 메모리에 접근이 불가능하기 때문에 주소 값을 임의의 메.. 2021. 8. 20.
[Java] 가변인자(Varargs) Java에서 오버로딩(Overloading)이란 개념이 존재한다. 오버로딩은 같은 이름의 메서드를 매개변수의 타입과 개수를 다르게 정의하여 다양한 메서드를 구현하는 것을 의미한다. 만약 Varargs 클래스에서 String 타입의 매개변수를 1, 2, 3개씩 가지는 print() 메서드를 오버로딩한다고 해보자. 아마 다음과 같이 구현할 것이다. class Varargs { public void print(String s1) { System.out.println(s1); } public void print(String s1, String s2) { System.out.println(s1 + " " + s2); } public void print(String s1, String s2, String s3) {.. 2021. 8. 16.
[Java] 명명 관습(Naming Conventions) 나는 프로그래밍을 할 때 변수, 메서드, 클래스 등을 선언할 때 일관성이 없고 그때그때마다 조금씩 다른 형식으로 선언하는 좋지 못한 습관을 가지고 있다. 이는 혼자 개발하는 데는 크게 상관이 없지만 협업 과정에서는 가독성이 상당히 떨어지기 때문에 의미를 이해하기가 난해해지고 오류 발생 가능성을 높일 수 있다. 이러한 문제점을 해결하기 위해서 언어마다 변수, 메서드 등의 이름을 다루는 명명 관습(Naming Conventions)이라는 것이 존재한다. 규칙(Rule)이 아닌 관습(Conventions)이기 때문에 반드시 지켜야 하는 것은 아니지만 이러한 관습을 유지함으로써 코드의 가독성을 높이며 오류 발생 가능성을 줄일 수 있기 때문에 불가피한 상황이 아니라면 명명 관습을 이행하는 것이 좋다. Java도 .. 2021. 8. 14.
[Java] JVM, JRE, JDK Java 프로그래밍 문법을 배우기 전에 JVM, JRE, JDK 등에 대해서 먼저 배우게 된다. 이들의 차이점에 대해서 한 번 알아보도록 하자. ​ JVM(Java Virtual Machine) ​ JVM은 자바 가상 머신(Java Virtual Machine)의 약자로써 Java의 특징인 동일한 프로그램이 다양한 컴퓨터에서 실행이 가능하도록 해주는 친구이다. ​JVM은 자바 소스코드(.java)가 컴파일러에 의해 만들어지는 바이트 코드(.class)를 해석하여 실행할 수 있다. ​또한, JVM은 플랫폼에 의존적이다. 즉, 리눅스의 JVM과 윈도우즈의 JVM은 서로 다르다. ​단, 컴파일된 바이트 코드(.class)는 어떤 JVM에서도 동작할 수 있다. ​ ​JVM은 다음과 같은 역할은 수행한다. 바이트.. 2021. 7. 22.
[Java] 패키지를 import 하면 언제 어떤 메모리 영역에 적재될까? 어떤 언어든지 간에 프로그래밍을 하다 보면 언어 내에서 이미 작성해놓은 패키지(라이브러리)나 외부 패키지(라이브러리)를 활용하는 경우가 상당히 많다. ​당장 알고리즘 문제를 풀 때만 하여도 입출력, 정렬 부분은 직접 구현하지 않고 이미 구현해놓은 기능들을 가져다 쓴다. import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; public class Main { public static void main(String[] args) { try (BufferedReader br = new BufferedReader(new InputSt.. 2021. 7. 22.
[Java] 스레드 풀(Thread Pool)(2) 이번 글에서는 스레드 풀이 처리한 작업 결과를 애플리케이션에게 전달하는 작업 완료 통보 받기에 대해 알아보자. ​작업 완료 통보 받기는 블로킹 방식의 작업 완료 통보 받기, 작업 완료 순으로 통보 받기, 콜백 방식의 작업 완료 통보 받기, 3가지의 방법이 존재한다. ​ 먼저 블로킹 방식의 작업 완료 통보 받기이다. ​블로킹 방식은 요청한 결과가 올 때까지 기다리는 방식을 의미한다. 작업을 요청하는 메서드 중 submit() 메서드는 작업 처리 결과를 반환한다고 하였다. 이때 Future라는 객체를 반환한다. Future 객체는 작업 결과가 아니라 지연 완료(pending completion) 객체라고 불리며 작업이 완료될 때까지 기다렸다가 최종 결과를 얻기 위해서 사용된다. ​get() 메서드를 호출하면.. 2021. 7. 22.
[Java] 스레드 풀(Thread Pool)(1) 일반적으로 하나의 프로세스는 하나의 스레드를 가지고 작업을 수행하게 되지만 다수의 작업이 요청되면 CPU는 이를 보다 효율적으로 처리하기 위해서 멀티 스레드 방식이라고 부르는 다수의 스레드를 생성하여 병렬 작업으로 처리하게 된다. 문제는 매번 작업이 요청될 때마다 스레드를 생성하고 작업에 스케줄링하는 것은 CPU가 바빠지며, 메모리 사용량이 늘어나기 때문에 애플리케이션의 성능이 급격히 저하된다는 점이다. ​이러한 문제를 해결하기 위해서 스레드 풀(Thread Pool)이라는 것을 사용한다. ​ 스레드 풀은 스레드를 미리 생성해놓은 공간이라고 생각하면 쉽다. 작업 요청이 있을 때마다 매번 스레드를 생성하지 말고 제한된 개수만큼 스레드를 미리 생성해놓고 작업 큐(Queue)에 들어오는 작업들을 하나씩 스레드.. 2021. 7. 22.
반응형