반응형 IT 개인 공부/Java38 [Java] 추상 클래스(Abstract Class) vs 인터페이스(Interface) 추상 클래스와 인터페이스는 비슷하면서도 다른 개념이다. 둘의 차이를 알고 있지만 이번 기회에 제대로 한 번 공부 및 정리해보려고 한다. 먼저 추상 클래스이다. Java에서 클래스는 일반 클래스와 추상 클래스로 나뉘는데 추상 클래스는 추상 메서드(완전하게 구현되어 있지 않은 메서드)를 0개 이상 가지고 있는 클래스를 의미한다. 추상 클래스는 추상 메서드뿐만 아니라 멤버 변수와 일반 메서드를 가질 수 있다. 추상 클래스와 추상 메서드는 abstract 키워드를 사용하여 구현한다. 추상 클래스는 메서드가 미완성되어 있기 때문에 객체를 생성할 수 없다. 오직 상속받은 자식 클래스에서만 객체를 생성할 수 있다. 추상 클래스는 상속을 통해 추상 메서드를 자식 클래스가 재정의하도록 기능을 확장시키는 것이 목적.. 2021. 7. 13. [Java] 제네릭(Generic) Java에서 컬렉션을 사용할 때 보통 다음과 같은 방식으로 '' 사이에 컬렉션에 넣을 변수의 타입을 선언할 것이다. List integer_List = new ArrayList(); List string_List = new ArrayList(); 이러한 문법을 제네릭이라고 부른다. 이번 기회에 한 번 제네릭에 대해서 공부 및 정리해보자. 제네릭 프로그래밍(Generic Programming)이란 JDK 1.5부터 도입된 문법으로 일반적인 코드를 작성하고 이 코드를 다양한 타입의 객체에 대하여 재사용하는 객체 지향 기법이다. 간단하게 말해서 클래스를 정의할 때, 구체적인 타입을 적지 않고 변수 형태로 적어 놓는 것이다. 그렇다면 먼저 제네릭을 왜 사용하는 것일까? 제네릭을 사용함으로써 잘못된 타입 변.. 2021. 7. 13. [Java] String, StringBuilder, StringBuffer String, StringBuilder, StringBuffer 모두 Java에서 문자열을 관리하는 클래스이다. 알고리즘 문제에서 문자열 연산이 자주 발생하는 문제인 경우 String을 사용한다면 시간 초과가 발생하는 경우가 상당히 많을 것이다. 이를 해결하기 위해선 String이 아닌 StringBuilder나 StringBuffer 클래스를 사용하여 문자열 연산을 처리해야 한다. 이들의 차이에 대해서 한번 정리해보도록 하자. 우선 문자열 연산시 String은 시간 초과가 나고 StringBuilder와 StringBuffer는 시간 초과가 나지 않는 차이점을 먼저 짚고 넘어가 보자. String으로 선언한 객체는 불변(immutable)하는 객체이다. 이게 무슨 뜻이냐면 new 연산을 통해 Str.. 2021. 7. 13. [Java] 객체 지향 프로그래밍(Object-Oriented Programming) Java를 공부하면서 Java는 객체 지향 언어라고 배웠다. Java는 클래스와 객체를 기반으로 프로그래밍을 하기 때문에 객체 지향 프로그래밍이라고 불리는구나 정도로만 생각했지만 Java를 주 언어로 삼은 김에 객체 지향 프로그래밍에 대해서 공부 및 정리해보려고 한다. 객체 지향 프로그래밍(Object-Oriented Programming)은 프로그램에서 필요한 데이터들을 추상화시켜 상태와 행위를 가진 객체로 나누고 이 객체들 간의 상호작용을 통해 프로그래밍하는 방법을 뜻한다. 객체 지향 프로그래밍을 알아보기 전에 가장 중요한 클래스와 객체에 대해서 이해하고 넘어가자. 클래스는 프로그램에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 특정 객체를 생성하기 위해 변수와 메서드를 정의하는 일종의 틀.. 2021. 7. 12. [Java] 오버라이딩(Overriding) vs 오버로딩(Overloading) Java를 배웠다면 위의 두 용어를 한 번쯤은 들어봤을 것이다. 두 용어 모두 발음도 비슷하고 개념도 비슷해 보이지만 전혀 다른 개념이다. 당연한 소리지만 다른 개념이니 구분하여 사용하고 있지 않을까? 솔직히 나도 오버라이딩과 오버로딩이 헷갈리기 때문에 이번 기회에 한번 개념을 공부해보고 정리해 보려고 한다. 먼저 오버라이딩(Overriding)이다. 오버라이딩은 상속 관계에 있는 클래스 간에 같은 이름을 재정의하는 기술이다. 자바의 경우 오버라이딩 시 동적 바인딩 된다. 그렇다면 한번 코드를 통해 이해해 보자. 다음과 같이 이름과 나이를 가지는 Person 클래스와 학교를 가지며 Person 클래스를 상속받는 Student 클래스가 있다고 하자. class Person { String name; .. 2021. 7. 12. [Java] 람다(Lambda) & 스트림(Stream)(2) 이번에는 스트림(Stream)에 대해서 배워보자(JDK 8에 새롭게 추가된 것이기 때문에 I/O Stream 과는 다른 개념이다). 스트림은 흐르는 시냇물을 뜻한다. 이처럼 자바에서 스트림은 컬렉션, 배열 등에 저장된 데이터들을 처리할 때 매번 따로 처리하지 않고 물 흘러가듯이 함수형 인터페이스(람다식)를 활용하여 연속적으로 처리해 주는 기능을 뜻한다. 이게 무슨 말인지 이해가 안 갈 수도 있으니 간단한 예제를 통해 이해해 보자. 양의 정수를 가지는 리스트가 존재한다고 하자. 리스트에 10보다 큰 정수가 몇 개 존재하는지를 알기 위해서는 어떻게 해야 할까? 일반적으로는 for 문을 이용하여 리스트를 순차적으로 탐색하며 개수를 카운트할 것이다. List numbers = Arrays.asList(1,.. 2021. 7. 12. [Java] 람다(Lambda) & 스트림(Stream)(1) 이번에 배워볼 내용은 JDK 8의 가장 큰 특징인 람다(Lambda)와 스트림(Stream)이다. 프로그래머스에서 다른 사람들의 풀이를 보면 가끔씩 보지 못한 이상한 문법들로 문제를 풀어낸 것을 볼 수 있다. 매번 저런 것도 있구나 하고 넘어갔었지만 이번 기회에 간단하게 한번 짚고 넘어가 보려 한다. 람다 표현식(Lambda Expression)은 익명 클래스에서 발전된 개념으로 익명 클래스에 대해서 먼저 알아보자. 익명 클래스는 단 하나의 객체만을 생성할 수 있는 클래스를 뜻한다. 자바에서 인터페이스를 구현하기 위해서는 인터페이스를 구현하는 클래스를 구현해 줘야 한다. 만약 인터페이스의 객체를 한 번만 사용할 것인데 이를 위해 클래스를 구현해야 한다면 비효율적일 것이다. 이를 개선하기 위해 굳이 .. 2021. 7. 12. [Java] 가비지 컬렉터(Garbage Collector) C, C++은 개발자가 메모리를 직접 관리해야 하지만 Java에서는 개발자가 별도로 관리할 필요가 없이 JVM의 Garbage Collector에서 알아서 메모리를 관리해 준다. 가비지 컬렉터는 이름 그대로 쓰레기를 수집해 주는 뜻이다. 가비지 컬렉터를 이해하기 전에 쓰레기가 무엇을 뜻하는지 한번 알아보자. Java에서 쓰레기는 Heap 메모리 영역에 생성된 객체들 중에 더 이상 참조되지 않는 객체들을 의미한다. 이게 무슨 뜻일까? 간단하게 다음과 같이 String 객체를 하나 선언했다고 하자. 이전 JVM 구조에서 메모리 영역을 공부할 때 스택 영역에는 지역 변수, 파라미터 등 임시 값, 힙 영역에는 new로 생성된 객체가 저장된다고 하였다. 1. String str = new String("Bef.. 2021. 7. 11. [Java] JVM(Java Virtual Machine) 자바의 가장 큰 특징은 "Write Once, Run Everywhere!", 동일한 프로그램이 다양한 컴퓨터에서 실행이 가능하다는 점이다. 이를 가능하게 해주는 게 바로 JVM이다. 보통의 프로그래밍 언어의 경우 소스 코드가 컴파일러에 의하여 기계어로 변환되어 컴퓨터에서 실행되도록 한다. 하지만 자바 컴파일러는 특정한 컴퓨터를 위한 코드를 생성하는 대신 가상적인 기계를 위한 코드를 생성한다. 이 코드는 바이트 코드(Byte Code), 중간 코드라고 불리며 자바 가상 기계(JVM)에 의해 해석되어서 실행된다. JVM이 바이트 코드를 해석한다는 것은 알겠다. 그렇다면 JVM의 구조는 어떤 식으로 이루어져 있으며 바이트 코드를 어떻게 해석하여 실행되도록 하는지 한 번 알아보자. JVM의 구성은 크게 4.. 2021. 7. 11. 이전 1 2 3 4 5 다음 반응형