kotlin 13

백오피스 프로젝트

🛵배달 시스템 Backend Server 🎁 프로젝트 개요 개발 기간 : 24.01.22 ~ 24.01.29 (1주) 개발 환경 : Kotlin, Spring Boot, Supabase, PostgreSql 프로젝트 이름 : 배달 프로젝트 프로젝트 설명 : 배달 시스템을 모방한 백엔드 시스템 개발 👩 Team B05 오재영 github 역할 - 와이어 프레임, 프로필 관리, 계좌 관리, 인증/인가 박유진 github 역할 - ERD, 가게 CRUD, 메뉴 CRUD 김성현 github 역할 - ERD, 리뷰 / 리뷰 답글 CRUD 윤승환 github 역할 - API 명세, 주문 Flow Chart, 장바구니 / 주문 CRUD 김현득 github 역할 - 가게 CRUD 초안 작성 📚기술스택 Backend S..

Spring 입문 - DI (의존성 주입), IoC (제어의 역전), Bean

Dependency Injection (의존성 주입) 객체가 자체적으로 필요로 하는 의존성을 생성하는 것이 아니라, 외부에서 주입받는 디자인 패턴입니다. 객체간의 결합도를 낮추기 위해 사용합니다. 주로 Contructor 기반 주입, Field 기반 주입, Setter 기반 주입이 있습니다. DI를 사용하지 않을 경우 package org.example.ChickenStore class ChickenStoreWithoutDI { private val chicken: Chicken = FriedChicken() fun getCookedChicken(): Chicken { chicken.cook() return chicken } } class ChickenStoreWithoutDI2 { private val..

SpringBoot 2023.12.26

제네릭

제네릭 (Generic) 이란 클래스 내부에서 사용할 자료형을 나중에 인스턴스를 생성할 때 확정한다. 자료형의 객체들을 다루는 메서드나 클래스에서 컴파일 시간에 자료형을 검사해 적당한 자료형으로 선택할 수 있게 하기 위해 사용한다. 제네릭을 사용하면 객체의 자료형을 컴파일할 때 체크하기 때문에, 객체 자료형의 안전성을 높이고 형 변환의 번거로움이 줄어든다. 제네릭 사용방법 앵글브라켓() 사이에 형식 매개변수를 넣어 선언한다. 이때 형식 매개변수는 하나 이상 지정 가능하다. 형식 매개변수는 자료형을 대표하는 용어로 T와 같이 특정 영문 대문자를 사용한다. 제네릭을 사용하면서 얻을 수 있는 장점은 의도하지 않은 자료형의 객체를 지정하는것을 막고 객체를 사용할 때 원래의 자료형에서 다른 자료형으로 형 변환시 ..

Kotlin 2023.12.25

인터페이스

인터페이스 (Interface) 란 인터페이스에는 abstract로 정의된 추상메서드나 일반메서드가 포함된다. 추상클래스처럼 프로퍼티를 통해 상태를 저장할 수 없고 선언만 가능하다. 인터페이스도 마찬가지로 객체를 생성할 수 없고 하위 클래스를 통해 구현 및 생성해야한다. 인터페이스를 사용하는 이유? 추상클래스를 사용할 때의 제한을 생각해보자. 하위클래스는 상속을 하나만 허용한다는 단점이 있다. 또한 상위클래스와 하위클래스의 강한 연관이 생기면서 상위클래스의 영향을 그대로 받게된다. 그래서 상위클래스가 수정되었을 때 하위 클래스를 일일이 확인하기 어려운 경우 부작용이 발생할 수 있는것이다. 인터페이스는 클래스가 아니다. 그래서 상속의 개념이 아닌 구현의 개념이라 구현클래스 (하위클래스)와 강한 연관을 가지..

Kotlin 2023.12.25

추상클래스

추상클래스란 Abstract Class는 선언 등의 대략적인 설계 명세와 공통의 기능을 구현한 클래스이다. 추상이란말은 구체적이지 않은 것을 나타낸다. 추상클래스를 상속하는 하위 클래스에서 추상클래스의 내용을 더욱 구체화시켜야한다. abstract라는 키워드와 함께 선언하며 추상클래스로부터 일반적인 객체를 생성하는 방법으로 인스턴스화될 수 없다. 다만 추상클래스를 상속하는 하위 클래스가 어떻게 만들어야하는지를 나타내는 용도로 사용된다. abstract 사용 예시 // 추상클래스, 주 생성자에는 비추상 프로퍼티 선언의 매개변수 3개가 있음 abstract class Vehicle(val name: String, val color: String, val weight: Double) { // 추상 프로퍼티(반..

Kotlin 2023.12.25

지연초기화

lateinit / lazy 보통은 클래스에서 기본적으로 선언하는 프로퍼티는 null 값을 가질 수 없다. 그러므로 반드시 초기화가 되어야 하는것이 규칙인데, 초기화를 미룰 때 지연초기화 (lateinit, lazy)를 사용한다. 언제 사용할까? 의존성이 있는 초기화나 유닛 테스트를 위한 코드를 작성하면서, 설정에 의한 초기화를 할 때 불편하다. Car클래스의 초기화 부분이 Engine클래스와 의존성을 가질 때, Engine 객체가 생성되지 않으면 완전하게 초기화 할 수 없다. 이처럼 특정 객체에 의존성이 있을 때 지연초기화를 해야한다. lateinit 지연초기화 예시 class Person2 { lateinit var name: String //지연초기화 선언 fun test() { if(!::name..

Kotlin 2023.12.25

캡슐화

캡슐화(encapsulation)란 클래스를 작성할 때 외부에서 숨겨야 하는 속성이나 기능 가시성 지시자(visibility modifiers)를 통해 외부 접근 범위를 결정할 수 있다. private: 이 지시자가 붙은 요소는 외부에서 접근 불가 public: 이 요소는 어디서든 접근이 가능 (기본값) protected: 외부에서 접근할 수 없으나 하위 상속 요소에서는 가능 internal: 같은 정의의 모듈 내부에서 접근 가능 public, private 코드 예시 package com.example.demo.inherit private class PrivateTest { private var i = 1 private fun privateFunc() { i += 1 println(i) } fun ac..

Kotlin 2023.12.24

프로그래머스 코딩테스트 / 약수의 합

약수는 mod로 계산했을 때 값이 0이 나오기 때문에 그 값을 더해주는 식으로 풀어봤다. class Solution { fun solution(n: Int): Int { var answer = 0 for (i in 1..n) { if(n % i == 0) { answer += i } } return answer } } if문으로 약수의 값을 구하고 answer에 하나씩 더해준 후 return했다. 다른사람의 풀이 class Solution { fun solution(n: Int): Int { var answer = 0 answer = (1..n).filter { n % it == 0 }.sum() return answer } } filter함수를 사용해 훨씬 보기 깔끔하다. filter는 Boolean값..

Algorithm 2023.12.24

프로그래머스 코딩테스트 / 자릿수 더하기

한 덩어리의 숫자를 쪼개서 값을 더해야한다. 아무리 봐도 이해가 가지 않아서 풀이를 보고 풀었다. class Solution { fun solution(n: Int): Int { var answer = 0 val str: String = n.toString() val numbers = str.toCharArray().map { it.digitToInt() } answer = numbers.sum() return answer } } n을 String으로 변환시킨다. String으로 변환시킨 n을 Char로 쪼갠다. map으로 Int 타입으로 변경시킨다. (문자 변수를 그대로 Int 시키면 아스키코드이기 때문에 변환이 제대로 되지 않는다. digitToInt()를 사용하면 숫자 그대로 출력이 된다. 다른사람..

Algorithm 2023.12.24

다형성

다형성 (polymorphism)이란? 같은 이름을 사용하지만 구현 내용이 다르거나, 매개변수가 달라서 하나의 이름으로 다양한 기능을 수행할 수 있는 개념이다. Static Polymorphism 컴파일 타임에서 결정되는 다형성 단순하게 보면 메서드 오버로딩을 사용할 때 Dynamic Polymorphism 런타임 다형성 동적으로 구성되는 오버라이딩된 메서드를 사용할 때 오버라이딩 (overriding) 기능을 완전히 다르게 바꾸어 재설계 누르다 -> 행위 -> push() push()는 '확인' 혹은 '취소' 용도로 서로 다른 기능을 수행할 수 있다. 오버로딩(overloading) 기능은 같지만 인자를 다르게 하여 여러 경우를 처리 출력한다 -> 행위 -> print() ..

Kotlin 2023.12.23