_

Always be tactful

개인 학습/자바 스프링 19

[Spring] OOP: SOLID 원칙

Object-Oriented Programming 👉 객체지향 프로그래밍을 위한 다섯 가지 중요한 설계 원칙을 SOLID 원칙이라고 한다. *더보기는 관련 예시임 1. Single Responsibility Principle (단일 책임 원칙)하나의 클래스는 단 하나의 책임만 가져야 한다.즉, 여러 기능을 한 클래스에서 처리하지 않는다.더보기✅ 정보 저장 기능과 정보 출력 기능을 별도의 클래스로 분리2. Open/Closed Principle (개방-폐쇄 원칙)확장에는 열려 있고, 수정에는 닫혀 있어야 한다.즉, 기존 코드를 변경하지 않고 새로운 기능을 추가할 수 있도록 설계한다.더보기✅ 조건문 대신, 인터페이스나 추상 클래스를 사용하여 새로운 기능을 확장3. Liskov Substitution Pri..

[Java] 제네릭과 명명 관례

제네릭  제네릭은 용어에서 알 수 있듯이 범용적으로 사용하는 데 목적이 있다. 이는 메서드에 매개변수를 추가하는 것과 비슷한 맥락이지만 결정적인 차이가 있다.  메서드는 매개변수에 인자를 전달해서 사용할 값을 전달한다. 반면, 제네릭 클래스는 타입 매개변수에 타입 인자를 전달해서 사용할 타입을 결정한다.더보기를 생략한 Raw Type도 가능하지만 사용하지 않는다. Raw Type이 존재하는 이유는 과거 코드와의 하위 호환이 필요했기 때문에 지원할 뿐이다. 제네릭 명명 관례E - ElementK - KeyN - NumberT - TypeV - ValueS, U, V, etc.더보기타입 인자로 기본형(int)을 사용할 수 없으며, 대신 래퍼 클래스(Integer)를 사용한다.

[Java] OCP (Open-Closed Principle) / 개방-폐쇄 원칙

좋은 객체 지향 설계 원칙에는 여러 가지가 있지만, 그중 하나가 바로 OCP다.Open for extentionClosed for modification 즉, 기존 코드는 수정하지 않으면서 새로운 기능을 위해 확장할 수 있어야 한다. *기존 코드: 시스템의 핵심 동작 코드*확장된 부분: 요구사항 추가 구현Strategy Pattern  전략 패턴이란 다양한 객체 지향 디자인 패턴 중 하나로, 알고리즘을 클래스로 캡슐화하여 동적으로 변경할 수 있게 해주는 패턴이다. 이 패턴은 알고리즘을 사용하는 코드와 알고리즘 자체를 분리하여, 새로 추가된 알고리즘이 기존 코드에 영향을 주지 않도록 한다.[전략 패턴의 기본 구조]클라이언트 코드 (Context)전략 인터페이스 (Strategy)구체적인 전략 (Concre..

[Java] 인터페이스의 다중 구현

자바에서 다중 상속이 안 되는 이유가 무엇인가?특정 클래스를 상속받는다고 할 때, 자식 클래스에서 오버라이딩 하지 않은 부모 클래스의 메서드가 있다고 치자. 그런데 하필이면 A라는 부모에게도 m이라는 메서드가 있고, B라는 부모에게도 m이라는 메서드가 있다. 이 상황에서 m이라는 메서드를 호출할 때, A 클래스와 B 클래스 중 어느 부모 클래스의 메서드를 호출해야 하는가? 명확한 답이 없을 뿐더러 심각한 문제를 발생시킬 여지가 있다. 때문에, 자바에서는 다이아몬드 문제를 막고자 클래스의 다중 상속을 금지시킨다. 관련 게시물: 다이아몬드 문제 인터페이스는 다중 구현을 허용한다. 그 이유는 무엇인가? 인터페이스는 인터페이스를 구현하는 곳에서 해당 기능을 모두 구현해야만 한다. 각기 다른 인터페이스가 같은 이..

[Java] 객체 지향 프로그램과 다형성

자바는 객체 지향 언어다! 객체 지향 프로그램의 대표적인 특징은 아래와 같다.캡슐화상속다형성▶ 프로그래밍에서 다형성은 한 객체가 여러 타입의 객체로 취급될 수 있는 능력을 말한다. 다형성 이해를 위한 핵심 이론 두 가지은 아래와 같다.다형적 참조메서드 오버라이딩▶ 다형적 참조는 말 그대로 다양한 형태로 참조될 수 있음을 말한다. (상속 관계 주의: 부모 클래스의 객체를 자식 클래스의 참조 변수에 할당하는 것은 타입 불일치로 간주된다.)상속 예제public class Parent { public void parentMethod() { System.out.println("parent method"); }}public class Child extends Parent { public..

[Java] Getter, Setter 메서드 / 접근 제어자

접근 제어자getter/setter private 필드에 직접 접근할 수 없을 때, 보통 getter 메서드와 setter 메서드를 제공한다. 이렇게 하면 객체를 안전하게 조회하거나 변경할 수 있다.public class TestForInt { private int number; // getter public int getNumber() { return number; } // setter public void setNumber(int number) { if (number != 0) { this.number = number; } }}*get + 변수명 (낙타 표기법)*set + 변수명 (낙타 표기법)public ..

[Java] super 키워드 / 상속과 메모리 구조

자바는 단일 상속만 가능하며, 상속받고자 하는 클래스에 extends 키워드를 사용하면 된다. 아래 예제에서는 Animal 클래스를 Dog와 Cat이 상속받아 기존의 코드를 재사용한다.// 부모 클래스public class Animal { public void eat() { System.out.println("Eat!"); }}// 자식 클래스public class Dog extends Animal { public void bark() { System.out.println("bark!"); }}// 자식 클래스public class Cat extends Animal { public void meow() { System.out.println(..

[Java] static final / 매직 넘버와 상수

매직 넘버 프로그래밍에서 매직 넘버란 코드에서 의미를 명확히 알 수 없는 숫자 값을 말한다. 특정 숫자가 변수 없이 바로 사용되어 이 숫자가 어떤 의미를 가지는지 알기 어려운 경우 매직 넘버라고 부르는 것이다. 매직 넘버는 가독성을 저하시킬 뿐 아니라, 유지보수 측면에서도 매우 비효율적이므로 지양하는 것이 좋다. 그래서 이번에는 매직 넘버 문제를 해결하는 상수에 대해 포스팅하도록 하겠다.상수 관례public class Constant { // 수학 상수 public static final double PI = 3.14159265358979323846; public static final double EPS = 1e-6; // 시간 상수 public static final int..

[Java] 자바의 메모리 구조

멤버 변수 용어 정리public class Data { public String name; // 인스턴스 변수 public static int count; // 클래스 변수, 정적 변수, static 변수 public Data(String name) { this.name = name; count++; }}  위 코드에서 name과 count 모두 멤버 변수이다. 그러나 static 유무에 따라 인스턴스 변수, 클래스 변수로 구분된다. 인스턴스 변수의 경우 인스턴스를 만들 때마다 새로 만들어지지만, 클래스 변수의 경우 일반적으로 자바 프로그램을 시작할 때 딱 1개가 만들어진다. 클래스 변수는 인스턴스 변수와는 달리 여러 곳에서 공유하는 목적으로 주로 사용된다...

[Java] '예외 처리' 완전 정복하기

예외 처리  예외 처리란 프로그램 실행 중 발생할 수 있는 오류를 처리하는 기법이다. 즉, 예외가 발생하더라도 프로그램이 갑자기 종료되지 않고, 예외 처리 코드를 통해 문제를 해결할 수 있게 된다. (예외 처리를 하지 않는 경우, 예외가 발생한 지점에서 UncaughtException이 발생하여 프로그램이 비정상적으로 종료된다.)  여기서 예외 발생이라고 함은, 파일을 열고자 하는데 열 파일이 존재하지 않는다거나, 배열의 인덱스를 잘못 참조하는 등 예기치 않은 상황을 말한다. (아래 예시는 배열의 인덱스가 한도를 넘었을 때의 예외다.)int[] arr = new int[3];arr[10] = 10; // ArrayIndexOutOfBoundsException 발생예외 종류  자바에서 예외는 크게 Chec..

[Java] Scanner, BufferedReader

Scanner와 BufferedReader는 입력을 읽는 데 사용되는 클래스이다. 실제로 두 클래스 모두 내부적으로 버퍼링을 사용하여 데이터를 처리한다. 그러나 둘 사이에는 명확한 차이점이 존재하는데, 바로 입력 방식과 성능이다. 핵심은 이러한 차이점으로 인하여 각각의 사용 용도가 어느 정도 정해져 있다는 것인데, 본 포스팅에서는 두 클래스 간의 차이점을 비교 분석해보려고 한다.주요 특징 비교[Scanner]  Scanner는 다양한 자료형을 쉽게 처리하는 클래스이다. 이에 따라 다양한 메서드가 존재하는데, 예를 들어 nextLine()은 한 줄을 읽고, nextInt(), nextDouble()은 각각 정수와 실수 형식으로 입력을 받는다.  이렇듯 Scanner는 굉장히 좋아 보이지만 치명적인 단점이 ..

[Java] if 문, switch 문, 삼항 연산자

if 문String grade = "A";int bonus;if (grade == "A") { bonus = 1000000;} else if (grade == "B") { bonus = 800000;} else if (grade == "C") { bonus = 500000;} else { bonus = 0;} if 문은 가장 기본적인 제어문이다. 그렇기에 사실상 if 문만 쓰더라도 문제 될 것은 없다. 그러나 특정 상황에서는 if 문보다 가독성이 더 높은 switch 문을 선호한다.switch 문String grade = "A";int bonus;switch (grade) { case "A": bonus = 1000000; break; case "..

[Java] 객체의 실제 메모리 주소 얻기

안타깝게도 자바에서 객체의 실제 메모리 주소를 직접적으로 얻는 것은 불가능하다.  일단 자바는 가비지 컬렉션을 사용한다. 자바 가상 머신과 가비지 컬렉터가 메모리 관리와 객체 생명주기를 처리한다. 그렇기에 자바에서는 메모리 주소를 숨기고 객체에 대한 참조만을 제공한다. (애초에 설계부터 객체의 메모리 주소나 포인터를 프로그램에서 접근할 수 없도록 설계했다는 말이다.)참조 예시String str1 = new String("funczun");String str2 = str1; // str2가 str1을 참조 * str1, str2 모두 같은 객체를 참조하고 있지만, 메모리 주소에 직접 접근하지 않고 참조 변수를 통해 객체를 사용한다.가비지 컬렉션 (Garbage Collection)  가비지 컬렉션은 메모리..

[Java] ==, equals() /문자열 비교 정복하기

내가 파이썬만을 고집했다면 평생 들지 않았을 의문 중 하나이다. 왜 자바에서는 문자열을 비교할 때, equals() 메서드를 사용해야 하는가?자바에서 문자열 비교 시, == 또는!= 연산자를 쓴다면 어떻게 되는가? 이에 대해 명쾌하게 답할 수 없다면 본 게시물을 읽을 가치가 있다.String은 객체 타입인 '클래스'이다.String str1 = new String("funczun");String str2 = new String("funczun"); 우선 클래스답게 문자열 두 개를 생성해보았다.System.out.println(str1 == str2); // false 두 문자열을 == 연산자를 통해 비교하니 false가 출력되었다. 분명 str1, str2 모두 "funczun"으로 동일한데 false로..

[Java] 주요 연산자 알아보기

// 몫 반환int num1 = 5, num2 = 2;System.out.println(num1 / num2);// 변수 추가 선언int newNum = 0;// 전위 증감 연산자num1 = 0;newNum = ++num1;System.out.println("newNum = " + newNum + ", num1 = " + num1);// 후위 증감 연산자num1 = 0;newNum = num1++;System.out.println("newNum = " + newNum + ", num1 = " + num1);// 비교 연산자int a = 1;float b = 0.1f;double c = 0.1;System.out.println(a + b == 1.1);System.out.println(a + c == 1...

[Java] 기본 변수 한 장 정리

byte b = 127;// 1byte (2^8): -128 ~ 127short s = 32767;// 2byte (2^16): -32,768 ~ 32,767int i = 2147483647;// 4byte (2^32): -2,147,483,648 ~ 2,147,483,647long l = 9223372036854775807L;// 8byte (2^64): -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807float f = 3.14f;// 4byte (2^32): 대략 -3.4E38 ~ 3.4E38 (7자리 정밀도)double d = 3.14;// 8byte (2^64): 대략 -1.7E308 ~ 1.7E308 (15자리 정밀도)boolean bool = t..

[Java] 향상된 for 문

향상된 for 문은 주로 배열 또는 컬렉션 객체의 요소들을 쉽게 순회하기 위해 사용된다. Java 5에서 도입된 구문으로, 앞으로 쓰일 일이 많으니 잘 기억해 두자.향상된 for 문 기본 문법for (타입 변수 : 배열) { // 반복할 코드} 굳이 표현식을 적자면 이렇다만, 그냥 예시를 보는 편이 훨씬 낫다.전통적인 for 문과의 차이점String[] names = {"Alex", "Brian", "Chris"};// 전통적인 for 문for (int i = 0; i  위 코드는 우리가 흔히 알고 있는 전통적인 방식의 for 문이다. 변수 i를 통해 반복 횟수를 지정하고, 인덱싱을 통해 이름들을 출력하고 있다.String[] names = {"Alex", "Brian", "Chris"};// 향상..