Laguage
[Java] 로또 (객체 지향 편)
우테코 5기 3주차 미션을 다시 설계하고 객체 지향 프로그래밍을 연습을 초점에 맞추어 글을 써봅니다. 입출력의 요구사항 설계는 생략 하니 이점 양해 부탁 드립니다. 우선 프로그래밍 요구사항을 살펴보고 개념 또는 도메인을 정해 역할을 부여해보자. 🚀 기능 요구 사항 로또 게임 기능을 구현해야 한다. 로또 게임은 아래와 같은 규칙으로 진행된다. `로또 번호의 숫자 범위는 1~45까지이다. 1개의 로또를 발행할 때 중복되지 않는 6개의 숫자를 뽑는다. 당첨 번호 추첨 시 중복되지 않는 숫자 6개와 보너스 번호 1개를 뽑는다. 당첨은 1등부터 5등까지 있다. 당첨 기준과 금액은 아래와 같다. - 1등: 6개 번호 일치 / 2,000,000,000원 - 2등: 5개 번호 + 보너스 번호 일치 / 30,000,00..
[Java] 숫자 야구 게임 (객체 지향 편)
우테코 기간에 했던 미션들을 다시 리팩터링하고 객체 지향 프로그래밍에 대해 연습해보고자 2주차에 진행 하였던 숫자 야구 게임에 대해 적어보겠습니다. 먼저 아래와 같은 기능 요구사항이 있는데 어떠한 개념들이 어떤 역할을 하는지 정리해봅시다. 🚀 기능 요구 사항 기본적으로 1부터 9까지 서로 다른 수로 이루어진 3자리의 수를 맞추는 게임이다. 같은 수가 같은 자리에 있으면 스트라이크, 다른 자리에 있으면 볼, 같은 수가 전혀 없으면 낫싱이란 힌트를 얻고, 그 힌트를 이용해서 먼저 상대방(컴퓨터)의 수를 맞추면 승리한다. 예) 상대방(컴퓨터)의 수가 425일 때 123을 제시한 경우 : 1스트라이크 456을 제시한 경우 : 1볼 1스트라이크 789를 제시한 경우 : 낫싱 위 숫자 야구 게임에서 상대방의 역할을..
[Java] 지네릭 변성
최범균님의 강의를 듣고 정리한 내용입니다. 참조 : https://www.youtube.com/watch?v=PtM44sO-A6g&list=PLwouWTPuIjUg0dmHoxgqNXyx3Acy7BNCz&index=18&ab_channel=최범균 강의 내용이 유익하고 Generic 개념을 다시 정리해보자 글을 포스팅하려고 합니다. 좋은 강의가 많으니 한번 보시면 좋을 거 같습니다. 들어가기전. 지네릭은 컴파일러에게 타입을 알려주고 해당 타입의 안정성을 주는 장점이 있습니다. 프로그래밍에서 변성, 무변성, 공변, 반공변 등의 특징들을 많이 들어보셨을 겁니다. 이러한 특징들을 지네릭이 가지고 있어 문제점과 문제점의 개선 방법 등을 적어 보겠습니다. 지네릭과 하위 타입 public class Student ex..
[Java] Decorator Pattern
데코레이터 패턴은 디자인 패턴 중 하나이다. 데코레이터 패턴을 사용하여 정적으로 또는 동적으로 객체에 추가 책임을 추가할 수 있다. 데코레이터는 원래 객체에 대한 향상된 인터페이스를 제공한다. 이 패턴을 구현할 시 상속보단 구성을 위주로 각 데코리에터 요소에 대해 반복해서 상속하는 오버헤드를 줄일 수 있다. 코테를 준비하시는 분이시라면 아래와 같은 코드를 작성 해본적이 있을 것이다. BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 기반 스트림으로 읽고 보조 스트림으로 추가적인 기능을 제공하는 구조로 테코레이터 패턴의 대표적인 예시가 된다. 이는 객체의 결합을 통해 기능을 동적으로 유연하게 확장할 수 있는 장점이 있다. 크..
[Java] Exception
예외 처리의 중요성 비정상 종료를 방지 로그를 잘 기록하여 버그의 상황이 어떤 것인지 확인 아래 예제 코드를 보면 예외 처리의 중요성을 잘 알게 될 것이다. int[] arr = new int[10]; try { for (int i = 0; i < arr.length + 1; i++) { arr[i] = i; } } catch (ArrayIndexOutOfBoundsException e) { e.printStackTrace(); String message = e.getMessage(); System.out.println(message); } // 예외를 처리하고 정상 수행이 된다. // 비정상 종료가 되지 않는다. System.out.println(Arrays.toString(arr)); 배열의 길이에 ..
[Java] Stream
배열이나 컬렉션들 자료들의 대해 연산을 해준다. 연산들의 처리가 추상화 되어 있고 일관성 있게 제공해주는 기능이다. 스트림은 한번 생성하고 사용한 스트림은 소모가 되므로 재사용할 수 없다는 단점이 있다. 스트림 연산은 기존 자료를 변경하지 않는다. 스트림 연산은 중간 연산과 최종 연산이 있다. 중간 연산은 1 ~ n 번 연산 가능 최종 연산은 중간 연산이 된 후 에 1 번 연산 가능 중간 연산 중에 결과는 연산 중에 알 수 가 없다. 최종 연산이 되어야 결과를 알 수 있다 이를 “지연 연산" 이라 한다. 기본적인 최종 연산을 알아보자. int[] arr = {1, 2, 3, 4, 5}; int sum = Arrays.stream(arr).sum(); int count = (int) Arrays.strea..
[Java] Lambda expression
자바의 기능이 늘어남으로 심플성과 안정성을 추구하는 자바는 jdk8 부터 람다식(함수형 프로그래밍 방식)의 스펙을 제공해준다. 매개변수를 받고 받은 매개변수를 기반으로 내부에서만 함수가 진행 되기 때문에 외부 자료에 부수적인 영향을 주지 않는 장점이 있다. 즉, 내부적인 작업이 가능하기 때문에 병렬 처리가 가능하고 멀티 스레드 환경에서 안정성의 장점을 가진다. 하지만 가독성이 떨어지는 단점이 존재하긴 한다. 장점 외부 자료에 영향을 주지 않고 내부 작업이 가능 병렬 처리가 가능 멀티 스레드 환경에서 안정성 단점 가독성이 떨어짐 람다식 문법 (매개변수) → (실행문) 두 수를 입력 받아 sum 하는 sum() funtional interface 사용 @FunctionalInterface public int..
[Java] Inner Class
클래스 내부에 선언한 클래스로 중첩 클래스라고도 말한다. 이 클래스를 둘러싼 외부 클래스와 밀접한 연관이 있는 경우가 많다. 내부 클래스의 종류 인스턴스 내부 클래스 정적(Static) 내부 클래스 지역(local) 내부 클래스 익명(anonymous) 내부 클래스 인스턴스 내부 클래스 내부적으로 사용할 클래스를 private으로 선언하기를 권장한다. private 이 아닌 다른 접근 제어자를 사용하면 다른 외부 클래스에서 생성할 수 있는 문제. 외부 클래스가 생성된 후에 생성된다. 예시 // Outer 를 생성한 후 Outer outer = new Outer(); // Inner 생성 가능 Outer.Inner inner = outer.new Inner(); 생성자를 사용하여 내부 클래스를 생성하는 것..
[Java] Generic Programing
클래스에서 사용하는 변수의 자료형이 여러개 일 수 있고, 그 기능이 동일한 경우 클래스의 자료형을 정하지 않고 추후 해당 클래스를 사용할 때 지정 할 수 있도록 선언해주는 프로그래밍이다. 실제 사용되는 자료형의 반환은 컴파일러에 의해 검증되므로 기존에 instancof 연산자로 타입 체크의 수고를 덜어주고 의도치 않은 타입의 객체가 저장되는 것을 막고, 저장된 객체를 꺼내올 때 원래의 타입과 다른 타입으로 잘못 형변환되어 발생할 수 있는 오류들을 줄여든다. 한마디로 객체의 타입 안정성과 형변환의 번거로움을 줄인다. 라는 장점이 있다. 주로 사용하는 곳은 컬렉션 프레임워크와 jpa 등 여러 곳에서 많이 쓰이는 것을 볼 수 있다. Generic의 장점을 보여주는 예제 구현 public class Bread ..
[Java] Inheritance in Java
자바에서 상속이란? OOP에서 상속은 기존 코드를 재사용하거나 기존 유형을 확장하는 용도로 사용합니다. 자바에서 클래스는 다른 클래스와 여러 인터페이스를 상속할 수 있는 반면 인터페이스는 다른 인터페이스를 상속할 수 있습니다. 필요성 게임들의 캐릭터를 객체화를 시켜봅시다. 캐릭터라는 클래스는 여러가지 직업들을 가질 수 있고 무기도 가질 수 있어 너무 추상적인 클래스입니다. 기본적인 특징만 정의하고 이를 재사용하는 상속이 필요합니다. public class Character { private String weapon; private int level; private long hp; private long mp; // 스텟 클래스를 따로 만들어 참조하는 식으로 하는게 좋을거 같다! private int st..
[Java] Java Interface
인터페이스는 추상 클래스와 동일한 미완성 설계도?? 추상적인 계층이다. 객체 지향 관점에서 추상 클래스는 is a 관계에 풀어서 사용하고 인터페이스는 has a 관계에 풀어서 사용한다. 이점을 꼭 기억하자. 추상 클래스에 관한 글에 Car클래스의 자율주행기능 modeChange() 메서드를 따로 인터페이스로 빼서 구현해보겠습니다, public interface DrivingFunction { void modeChange(); } DrivingFunction 인터페이스는 자율주행 기능을 정의해놓았다. 그냥 기본 틀이고 구현은 안되어 있다. 자율주행 기능이 있는 차들에게만 이 기능을 구현 해주면 된다. public class Tesla implements DrivingFunction { // fields....
[Java] Abstract Classes in Java
추상 클래스란 공통된 기능과 속성들을 정의한 클래스를 말한다. 공통된 기능은 메서드를 구현하여 한 곳에서 사용할 수 있게 정의해두고 공통된 기능인데 내부 로직을 다르게 만들어야 한다면 메서드 시그니처만 정의 해주면 된다. 추상 클래스는 is a 관계에 사용되는 것을 알고 들어가자. 다음으로 is a 관계인 “테슬라와 현대차는 자동차다" 로 예를 들어볼것입니다. 테슬라는 자율주행 모드를 지원하는 대표적인 차량이다. 현대차도 최근에 자율주행 모드를 지원하는 차량을 많이 판매하고 있다. 두 차량의 공통된 기능은 자율주행모드 다. 하지만 자율주행모드를 구현하는 로직은 서로 다를 것이다. 같으면 내부 스파이가 있을 수 도!!!! 차량들을 클래스로 만들어 구현해보자. 자동차 → 상위 클래스 public abstra..
[Java] Polymorphism in Java
사전적 의미 여러 다른 형태로 발생하는 조건 프로그래밍 루틴이 서로 다른 시간에 서로 다른 유형의 타입 사용할 수 있도록 하는 기능 직원과 매니저의 관계 현실 매니저는 직원에게 일을 하나하나 간섭하여 시키고 알려준다. 직원은 매니저를 욕하며 일한다. (넝~담!) 프로그램 매니저는 직원에게 일만 시킴 → 무슨일을 하는지 모름! 직원은 일을 함 → 자율적으로 일한다 구현 코드 public class Manager { private List employees = new ArrayList(); public void orderToDoJop() { for (Employee employee : employees) { if (employee != null) { employee.work(); } } } public vo..
[Java] Java 에서 파일을 읽는 여러가지 방법
목표 클래스 경로, URL에서 파일을 로드하는 방법 BufferedReader, Scanner, StreamTokenizer, DataInputStream, SequenceInputStream 및 FileChannel 사용하여 읽는 방법 UTF-8로 인코딩된 파일을 읽는 방법 입력 파일 읽는 방법 읽을 파일을 준비한다. test.txt Hello, World! 파일을 읽는 메서드를 준비한다. public class HelperFactory { public static String readFromInputStream(InputStream inputStream) throws IOException { StringBuilder sb = new StringBuilder(); try (BufferedReader b..
[Java] What is Serialization in Java?
직렬화란? JVM 메모리 내 스택과 힙영역에 저장되어 있는 객체를 외부에서 사용할 수 있도록 Byte 형태로 변환하는 과정을 직렬화라고 한다. 직렬화와 역직렬화를 통칭하여 직렬화 기술이라 말한다. 사용하는 이유? 서로 다른 가상메모리 공간에서 데이터를 통신하고 싶다. 참조값(주소값) 으로 전달하면 사용할 수 있을까? 다른 환경에서 주소값을 알고 있어도 독립적인 특징을 가지고 있는 가상메모리에서 의미가 없어진다. 하지만 직렬화를 사용하여 데이터를 바이트 형태로 변환하고 전달하면 받는 쪽에서 역직렬화를 하여 데이터를 얻어올 수 있다. 직렬화의 조건 implement Serialization 상위 클래스가 Serialization 인터페이스를 구현 한 경우 상속관계의 클래스 중 상위 클래스가 Serializa..