
🍰 클래스가 필요한 이유 자바 세상은 “클래스” 와 “객체” 로 이루어져 있다. 그럼 클래스와 객체가 왜 필요한지, 클래스가 어떤 방식으로 발전하면서 만들어졌는지 차근차근 알아보자. 먼저 학생 2명의 이름, 나이, 점수를 출력하는 코드를 작성해보자.
🤲 기본형 vs 참조형 자바에서 참조형을 이해하는 것은 매우 중요하다. 변수의 데이터 타입은 크게 보면 사용하는 값을 변수에 직접 넣을 수 있는 “기본형” 과 실제 데이터가 있는 주소를 가리키는 참조값을 넣을 수 있는 “참조형”, 이렇게 2가지로 분류할 수 있다. 기본형(Primitive Type) : int, long, double, boolean처...

# 🚩 절차 지향 프로그래밍 프로그래밍 방식에는 크게 **`절차 지향 프로그래밍`**과 **`객체 지향 프로그래밍`**으로 구분할 수 있다. ***절차 지향 프로그래밍*** - 말 그대로 절차를 지향한다. 실행 순서를 중요하게 생각하는 방식이다.

🌱 생성자는 왜 필요할까? 객체를 생성하는 시점에 뭔가 하고 싶다면 생성자를 이용하면 된다. 근데 생성자가 왜 필요한건지 코드로 확인하고 진행하도록 하자. 이처럼 회원 객체를 생성하고 나면, name, age, grade 같은 멤버 변수에 초기값을 설정해줘야 한다

기능이 많이 추가되면서 클래스 개수도 많아지면 어떻게 될까? 관련 있는 기능들끼리 분류해야 할 필요가 있을 것이다. 마치 폴더, 디렉터리처럼 자바에도 “패키지” 라는 개념이 존재한다. 📦 패키지 사용 바로 사용법에 대해 알아보자. 패키지를 먼저 만들고 클래스를 만들어야 하는데, 여기서 패키지의 위치에 주의하자. 위와 같이, 패키지를 사용할 때는 항상...

🤔 왜 필요하지? 자바는 접근 제어자(Access Modifier)라는 것을 제공한다. 이걸 사용하면 해당 클래스 외부에서 특정 필드나 메서드에 접근하는 것을 허용하거나 제한할 수 있다. 대충 느낌은 뭔지 알겠다. 궁극적으로 접근 제어자가 왜 필요한지 아래 예제를 통해 알아보자. 만약 스피커 소프트웨어를 개발하려고 하는데, 스피커의 음량은 절대 100...

🗃️ 자바 메모리 구조 일단 비유를 통해 자바 메모리 구조를 알아보자. 자바 메모리 구조는 위와 같이 메서드 영역, 힙 영역, 스택 영역으로 나눠져 있다. 먼저 메서드 영역은 클래스 정보를 보관한다. 힙 영역에는 클래스를 통해 생성된 실제 인스턴스나 배열이 보관된

🍀 final 변수와 상수 final 키워드는 말 그대로 “끝” 이라는 뜻이다. final로 변수를 선언하면 그 값을 더 이상 바꿀 수 없다. final 키워드는 변수, 메서드, 클래스에 사용될 수 있지만, 일단 지금은 변수에 붙을 경우에 대해 알아보자. 보다시피

먼저, 아래 간단한 코드를 살펴보자. ```java package extends1.ex1; public class ElectricCar { public void move() { System.out.println("차를 이동합니다.");

객체 지향 프로그래밍의 대표적인 특징으로는 “캡슐화”, “상속”, 그리고 이번에 살펴볼 객체 지향 프로그래밍의 꽃, “다형성” 이 있다. 프로그래밍에서의 다형성이란, 한 객체가 여러 타입의 객체로 취급될 수 있는 능력을 말한다. 분명히 객체는 하나인데, 다양한 형태를

개, 고양이, 소의 울음 소리를 테스트하는 간단한 프로그램을 먼저 다형성을 사용하지 않고 설계해보자. 여기서 새로운 동물 인스턴스를 추가하려면 인스턴스를 또 생성하고, 메서드 호출 및 출력하는 코드도 작성해줘야 한다. 중복의 냄새가 물씬 풍긴다. 지금까지는 메서드를 사

먼저 다형성을 이용하지 않고, 운전자와 자동차의 관계를 개발해보자.현재 Driver는 k3Car라는 인스턴스 변수를 가지고 있고, 원래는 초기화를 하지 않았기 때문에 초기값은 null이지만 외부에서 setK3Car 메서드를 호출하면서 실제 인스턴스에 있는 참조값이 넘어

자바가 기본으로 제공하는 라이브러리, 그러니까 클래스의 모음 중에 가장 기본이 되는 것이 바로 java.lang 패키지다. java.lang 패키지의 대표적인 클래스들은 아래와 같다. 해당 클래스들은 자바 언어의 기본을 이루기 때문에 반드시 알아둬야 한다.Object

불변 객체를 알아보기 전에 기본형과 참조형의 공유라는 개념부터 알아보도록 하자. 자바의 데이터 타입을 크게 보면 “기본형”, “참조형” 으로 나눌 수 있다고 배웠다. 기본형은 하나의 값을 여러 변수에서 절대로 공유하지 않는 특징을 가졌고, 참조형은 하나의 객체를 참조값

자바에서 문자를 다루는 타입으로는 char, String 총 2가지가 있다. 기본형인 char 타입은 문자를 하나씩 다룰 때 사용하는데, 위처럼 여러 문자를 나열하려면 배열로 사용해야 하는 불편함이 있다. 따라서 자바는 문자열을 보다 편리하게 다룰 수 있도록 Strin

자바에서 기본형은 객체가 아니기 때문에 객체 지향 프로그래밍의 장점을 살릴 수 없다. 메서드도 사용할 수 없고, 객체 참조가 필요한 컬렉션 프레임워크도 사용할 수 없다. 그리고 제네릭도 사용할 수 없다. 그리고 무엇보다 null 값을 가질 수 없다는 점이 경우에 따라

먼저 아래 요구사항에 따라 클래스를 만들어보자.고객은 3등급으로 나누고, 상품 구매 시 등급별로 할인을 적용한다. 할인 시 소수점 이하는 버린다.BASIC: 10% 할인GOLD: 20% 할인DIAMOND: 30% 할인 회원 등급 외 다른 값이 입력되면 “할인 X” 를

🍱 중첩 클래스, 내부 클래스란? 중첩 클래스(Nested Class)는 말 그대로 클래스 안에 클래스를 중첩해서 정의한 것을 말한다. 중첩 클래스는 클래스를 정의하는 위치에 따라 여러가지가 있다. “정적 중첩 클래스” 가 있고, 내부 클래스 종류에는 “내부 클래

지역 클래스는 내부 클래스의 한 종류다. 따라서 내부 클래스의 특징을 그대로 가져간다. 껍데기 클래스의 인스턴스 변수에 접근할 수 있고, 지역 변수와 같이 코드 블록 안에서 정의되며 당연히 지역 변수에도 접근이 가능하다. 아래 예시를 보자.출력 결과를 보다시피, 지역

먼저 간단한 프로그램을 만들어보자. 사용자의 입력을 받아서 그 입력을 외부 서버에 전송하는 프로그램이다. 지금은 편의를 위해 출력으로 통신이 연결된다고 가정하도록 하자.키보드로 입력하면 Main에서 NetworkService로 메시지를 하나 보낸다. NetworkSer

앞서 만든 프로그램은 반환 값을 사용해서 예외를 처리했기 때문에 여러 문제가 발생했다. 정상 흐름과 예외 처리 로직이 뒤섞여 코드를 한눈에 파악하기 어려웠고, 가장 중요한 정상 흐름 로직보다 예외를 처리하는 코드가 훨씬 많았다. 자바 예외 처리를 도입하면서 위 문제들

일단 Integer, String 타입을 담고 출력하는 코드를 보도록 하자.보다시피 간단한 코드다. IntergerBox는 정수 10을 저장하고 출력하고 있다. StringBox도 문자열 “hello” 를 저장하고 출력하고 있다. 물론 IntegerBox의 경우에는 오

이제 동물 병원 클래스를 만들어 보자. 개 병원은 개만 받고, 고양이 병원은 고양이만 받도록 한다.이처럼 개와 고양이 각각의 클래스를 만들었다. 각 클래스마다 타입이 명확하기 때문에 다른 타입을 전달받으면 위와 같이 컴파일 오류를 터뜨린다. 타입 안전성은 높아서 좋지만

여러 데이터를 구조화해서 다루는 것을 자료 구조라고 한다. 자바는 배열 뿐만 아니라, 컬렉션 프레임워크라는 이름으로 다양한 자료 구조를 제공한다. 일단 그 전에 자료 구조의 기본이 되는 배열에 대해 알아보도록 하자.일단 배열 객체를 생성하면, 힙 영역에 배열의 공간이

연결 리스트에 들어가기 전에, 노드와 연결하는 컨셉에 대해 이해해야 한다. 일단 이전에 봤던 ArrayList는 내부에 배열을 사용해서 데이터를 보관하고 관리했다. 알다시피 배열은 크기를 미리 설정해야 하므로, 데이터가 어느 정도 추가되는지 알 수 없는 상황의 경우,

List 자료 구조는 순서가 있고, 중복을 허용하는 자료 구조라고 했다. 앞서 직접 구현했던 MyArrayList, MyLinkedList 모두 내부 구현만 약간 다를 뿐, 같은 기능을 제공하는 “List” 다. 상황에 따라 성능은 달라질 수 있지만, 사용자 관점에서는

List와 Set 자료 구조는 데이터를 저장하고 관리하는데 약간의 차이가 있다. List: 요소들의 순차적인 컬렉션(ex. 장바구니 목록)순서 유지: 리스트에 추가된 요소는 특정한 순서를 유지한다.중복 허용: 리스트는 동일한 값이나 객체의 중복을 허용한다.인덱스 접근:

위 코드에 중복을 허용하지 않고, 순서를 보장하지 않는 Set 자료 구조를 적용해보면서 리팩토링 해보도록 하자. 위 코드는 add() 메서드로 중복 데이터가 있는지 없는지 항상 확인해야 하는 번거로움이 있다. 데이터를 찾을 때도 전체 데이터를 다 뒤져봐야 해서 성능이

Set 자료 구조는 알다시피 중복을 허용하지 않고, 순서를 보장하지 않는 자료 구조다.Collection 인터페이스는 자바에서 다양한 데이터 그룹을 다루기 위한 메서드를 정의하고 있다. 그 하위에 Set 인터페이스는 java.util 패키지의 컬렉션 프레임워크에 속하는

Map 자료 구조는 Key-Value 형태의 쌍을 저장하는 자료 구조다. 파이썬의 딕셔너리와 유사하다. 키값은 중복되서는 안 되고 Map 내에서 유일해야 하며, 그 키를 통해 값을 빠르게 검색할 수 있다. 값은 중복될 수 있다. 추가로, Map 자료 구조는 순서를 유지

자료 구조에 들어 있는 데이터를 차례대로 접근해서 처리하는 것을 순회라고 한다. 하지만 알다시피 아주 다양한 자료 구조들이 존재하고 각각 접근하는 방식이 다를 것이다. 아래 예를 보자.ArrayList의 경우, 인덱스를 배열을 차지하고 있는 데이터 개수만큼 차례로 증가

어느 한 개발자가 유튜브 뮤직(프로그램 A)을 들으면서 인텔리제이(프로그램 B)로 신나게 개발하고 있다고 해보자. 만약 연산을 수행하는 CPU 코어가 1개만 있다고 가정했을 때…이처럼 “프로그램의 실행” 이라는 의미는, 위의 그림을 보다시피 프로그램을 구성하고 있는 코

스레드를 직접 만들어 보기 전에, 자바 메모리 구조에 대해 복습하고 진행하도록 하자.메서드 영역: 클래스의 실행 코드(바이트 코드)나 필드, 메서드와 생성자 코드 등 모든 실행 코드가 존재하는 클래스 정보, static 변수들을 보관하는 static 영역, 공통 리터럴

Thread 클래스는 스레드를 생성하고 관리하는 기능을 제공한다. 자바가 실행될 때 기본으로 제공되는 main 스레드와 직접 만든 스레드의 정보를 코드로 확인해보도록 하자.위의 코드를 보다시피, 스레드를 생성할 때 실행할 Runnable 인터페이스의 구현체 및 스레드의

스레드 제어와 생명 주기

기존에 상황에 따라 변하는 문자열 데이터가 있다고 한다면, 구체적인 값을 메서드(함수) 안에 두는 것이 아니라 매개 변수를 통해 외부에서 전달 받아 메서드의 동작을 달리 해서 재사용성을 높였다. 그리고 단순한 값이 아닌, 코드 조각 자체를 메서드에 전달할 때는 인스턴스

함수형 인터페이스에도 제네릭을 사용할 수 있다. 그 전에 함수형 인터페이스에 제네릭이 필요한 경우가 있는지 알아보자.위의 코드를 보면, 매개 변수의 타입과 반환 타입은 다르지만 모양이 완전 똑같은 2개의 인터페이스가 있다. 중복의 느낌이 강하게 온다. 다형적 참조를 활

먼저 숫자들이 들어 있는 리스트에서 짝수만 골라내는 행동과 홀수만 골라내는 행동을 구현해보자.람다를 사용하지 않았을 때의 구현 방식이다. 그냥 리스트를 순회해서 조건에 맞는 값을 넣고 결과를 반환하도록 한 것이다. 이제 filterEvenNumber()와 filterO