전체 글

전체 글

    제 1장. 웹과 네트워크의 기본에 대해 알아보자

    책(그림으로 배우는 Http&Network Basic)을 통해 HTTP와 NetWork에 대한 전체적인 큰 틀을 이해하고 그 내용들을 정리하고자 한다. 그렇기 때문에 추가적인 공부가 필요한 주제에 대해서는 다시 한번 자세히 블로깅을 하도록 하겠다. 📘 1. 기본용어 서버 리소스라고 불리는 파일 등의 정보를 저장 클라이언트 서버에 의뢰하는 웹 브라우저 HTTP(HyperText Transfer Protocol) 프로토콜 클라이언트에서 서버까지 일련의 흐름을 결정하고 있는 것 프로토콜(Protocol) 서로 다른 하드웨어와 운영체제 등을 가지고 서로 통신을 하기 위해 필요한 규칙 📘 2. TCP/IP 인터넷과 관련된 프로토콜들을 모은 것 TCP/IP는 '애플리케이션 계층', '트랜스포트 계층', '네트워크 ..

    이왕이면 제네릭 타입으로 만들라 - [5장. 제네릭(아이템29)]

    1. 들어가기 전 🏄‍♀️ 아래의 Object 기반으로 만들어진 Stack 클래스를 살펴보자. public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object e) { ensureCapacity(); elements[size++] = e; } public Object pop() { if(size == 0) throw new EmptyStackException(); Object resu..

    배열보다는 리스트를 사용하라 - [5장. 제네릭(아이템28)]

    1. 배열과 제네릭 타입의 차이 🦗 📗 1. 배열은 공변이고, 제네릭은 불공변이다. 배열은 공변(Convariant)이다. Sub가 Super의 하위 타입이라면 Sub[]는 배열 Super[]의 하위 타입이다. 제네릭은 불공변(Invariant)이다. 서로 다른 타입 Type1과 Type2가 있을 때, List은 List의 하위 타입도 아니고 상위 타입도 아니다. 공변과 불공변 중 어느 쪽이 문제가 있을까? 코드를 통해 알아보자. public static void main(String[] args) { // 배열 Object[] objectArray = new Long[1]; objectArray[0] = "타입이 달라서 넣을 수 없다."; // ArrayStoreException (런타임에 발생) //..

    제네릭(Generics) - 공변(Covariant), 불공변(Invariant), 반공변(Contravariant)

    1. 공변, 불공변, 반공변의 개념 🌂 변성(Variance)이란 타입의 계층 관계에서 서로 다른 타입 간에 어떠한 관계가 있는지를 나타내는 것이다. 변성의 3가지 종류인 공변(Covariant), 불공변(Invariant), 반공변(Contravariant)은 다음과 같은 특성을 가진다. 공변 S가 T의 하위 타입이면, S[]는 T[]의 하위 타입이다. 불공변 List와 List는 관계가 없다. 반공변 S가 T의 하위 타입이면, T[]는 S[]의 하위 타입이다. 2. 제네릭은 공변성이 없다. ☔ 자바에서 배열은 공변이고, 제네릭은 불공변이다. 즉, 객체 타입의 관계에서 A가 B의 하위 타입일 때, 배열 A[]는 B[]의 하위 타입이지만 Listsms List의 하위 타입이 아니다. public stat..

    페어프로그래밍(Pair Programming) 후기

    🌞 1. 서론 2명이서 프로젝트를 진행해야 할 일이 있었다. 지금까지는 협업을 한다고 하면 '분업을 하고 각자 맡은 일을 하는 방식'으로 협업을 진행하였다. 하지만 이 프로젝트를 하기 전에 '함께 자라기 - 애자일로 가는 길'이라는 책을 읽었고, 위에서 언급한 방식이 협력을 위한 방식이 아니라는 걸 알게 되었다. 사람들은 협력이 중요하다고 합니다. 그래서 프로젝트를 할 때 협력적으로 하자고 합니다. 그러나 실제 모습을 들여다보면 초반에 일을 세밀하게 나누고 선을 긋습니다. 그리고 안녕이죠. 각자 진행하고 나중에 만나서 서로 합쳐봅니다. 그 속을 들여다보면 협력은 거의 없습니다. - 함께 자라기 중 일부 내용 - 그래서 이번 기회에 애자일 방법론 중 하나인 페어프로그래밍(Pair Programming)을 ..

    형변환(캐스팅, Casting) - 업캐스팅(Up-Casting), 다운캐스팅(Down-Casting)

    1. 형변환(캐스팅) 개념 🦏 형변환(캐스팅)이란 변수 또는 상수의 타입을 다른 타입으로 변환하는 것을 말한다. 기본형(Primitive Type)에서는 boolean을 제외한 나머지 타입들은 서로 형변환이 가능하다. 참조형(Reference Type)에서는 서로 상속관계가 있는 클래스 사이에서만 형변환이 가능하다. 자손타입의 참조변수를 조상타입의 참조변수로, 조상타입의 참조변수를 자손타입의 참조변수로 형변환을 하는 것이다. 이 글에서는 기본형의 형변환보다는 참조형의 형변환에 초점을 맞추도록 한다. 참조형 캐스팅은 2가지로 나눌 수 있다. 1. 업캐스팅(Up-Casting) 자손타입의 참조변수를 조상타입의 참조변수로 변환하는 것 업캐스팅을 하면 상속받은 서브 클래스에 상관없이 하나의 인스턴스로 묶어서 관..

    비검사 경고를 제거하라 - [5장. 제네릭(아이템27)]

    1. 비검사 경고 개념 🦜 '비검사(unchecked) 경고'란 컴파일러가 타입 안전성을 확인하는데 필요한 정보가 충분하지 않을 때 발생시키는 경고이다. 비검사 경고의 예시 중에 하나로 다음과 같이 로 타입을 사용하는 경우를 들 수 있다. public static void main(String[] args) { // 비검사 경고 발생 // Raw use of parameterized class 'Set' Set names = new HashSet(); // 비검사 경고 발생 // Raw use of parameterized class 'HashSet' Set strings = new HashSet(); } 2. 비검사 경고를 제거해야 하는 이유 🦚 이번 아이템에서는 '비검사 경고를 제거하라'라고 말하고 ..

    로 타입은 사용하지 말라 - [5장. 제네릭(아이템26)]

    이번 장(5장)부터는 제네릭을 다룬다. 혹시나 제네릭에 대한 기본 개념이 필요하다면 이전 글을 먼저 보고 오도록 하자. 1. 로 타입 (Raw Type) 개념 💽 로 타입이란 제네릭 타입에서 타입 매개변수를 전혀 사용하지 않을 때를 말한다. 예를 들어 List의 로 타입은 List다. 2. 로 타입을 사용하면 안 되는 이유 💾 제네릭이 안겨주는 안전성과 표현력을 고려할 때 로 타입은 절대로 써서는 안 된다. 로 타입을 사용하는 코드(= 제네릭을 사용하지 않는 코드)와 로 타입을 사용하지 않는 코드(= 제네릭을 사용하는 코드)를 비교해 보자. 📒 1. 로 타입을 사용하는 경우 기본적인 동작은 numbers에 숫자를 넣고 반복문을 통해 들어간 숫자를 확인하려고 하는 코드다. 숫자가 들어가야 하지만 문자열이 ..

    제네릭(Generics) - 기본 개념

    JDK 1.5부터 도입된 제네릭(Generics)에 대해서 알아보자. '제네릭(Generic)을 사용하면 다양한 타입을 사용할 수 있다.' 정도로만 알고 있었는데 제대로 공부하려고 보니깐 생각보다 양이 많다. 쫌 많이 많다... 그래서 이번 글에서는 제네릭의 기번 개념에 대해서 알아보고 다음 글들을 통해 더 구체적으로 알아보는 것으로 하자. (이펙티브 자바 5장의 제네릭(아이템 26 ~ 아이템 33) 내용과 와일드카드 등의 내용을 추가적으로 다룰 예정이다.) (이펙티브 자바 5장 제네릭 파트를 읽으려는데 이해가 잘 되지 않아서 제네릭의 기본부터 블로깅하고 있는 중이다...😅) 1. 제네릭(Generic) 개념 🧱 우리는 제네릭(Generics)을 그 어떠한 개념보다 자주 사용한다. public stati..

    래퍼 클래스 (Wrapper Class)

    1. 개념 🚶‍♀️ 일반적으로 객체지향 개념에서 모든 것은 객체로 다루어져야 한다. 하지만 자바에서 8개의 기본형(boolean, char, byte, short, int, long, float, double)은 객체로 다루어지지 않는다. 자바가 완전한 객체 지향 언어가 아니라는 이야기를 듣지만, 보다 높은 성능을 얻을 수 있다는 장점이 있다. 프로그래밍을 하다 보면 기본형(Primitive Type) 변수도 어쩔 수 없이 객체로 다뤄야 하는 경우가 있다. 예를 들면, 매개변수로 객체를 요구할 때, 기본형 값이 아닌 객체로 저장해야 할 때, 객체 간의 비교가 필요할 때 등등의 경우에는 기본형 값들을 객체로 변환하여 작업을 수행해야 한다. 이럴 때 래퍼 클래스를 사용하여 각각의 타입에 해당하는 데이터를 인..

    톱레벨 클래스는 한 파일에 하나만 담으라 - [4장. 클래스와 인터페이스(아이템25)]

    소스 파일에 하나에 톱레벨 클래스(톱레벨 클래스란 파일에 정의되어 있는 가장 바깥에 있는 클래스를 말한다)를 여러 개 선언하더라도 컴파일할 때는 문제가 없다. 유효한 문법이라는 것이다. 하지만 이것은 아무런 득이 없을뿐더러 심각한 위험을 감수해야 한다. 그 이유는 한 소스 파일에 톱레벨 클래스를 여러 개 선언하면 컴파일 순서에 따라 결과가 달라질 수 있기 때문이다. 문제 상황에 대한 예시를 살펴보고, 해결책을 알아보도록 하자. 1. 문제점 💍 집기(Utensil)와 디저트(Dessert) 클래스가 Utensil.java라는 한 파일에 정의되어 있다고 하자. // Utensil.java class Utensil { static final String NAME = "pan"; } class Dessert {..

    멤버 클래스는 되도록 static으로 만들라 - [4장. 클래스와 인터페이스(아이템24)]

    중첩 클래스(nested class)란 다른 클래스 안에 정의된 클래스를 말한다. 중첩 클래스는 자신을 감싼 바깥 클래스에서만 쓰여야 하며, 그 외의 쓰임새가 있다면 톱레벨 클래스로 만들어야 한다. 중첩 클래스의 종류는 아래의 4가지가 있다. 정적 멤버 클래스 (비정적) 멤버 클래스 익명 클래스 지역 클래스 '정적 멤버 클래스'를 제외하고는 모두 내부 클래스(inner class)에 해당한다. '정적 멤버 클래스'와 '비정적 멤버 클래스'는 멤버 클래스에 해당한다. 이번 글을 통해 4가지 중첩 클래스에 대해서 알아보고, 왜 멤버 클래스는 되도록 static으로 만들어야 하는지 알아보고자 한다. 1. 정적 멤버 클래스 🧰 정적 멤버 클래스는 다른 클래스 안에 선언되고, 바깥 클래스의 private 멤버에도..