전체 글

주로 백엔드, 클라우드 인프라 주제를 다룹니다
다형성 다형성은 객체지향의 특징중 하나이다(객체지향의 특징 : 캡슐화, 다형성, 상속성, 동적바인딩, 추상화). 다형성이란, 여러가지 형태를 가질 수 있는 능력을 의미한다. 자바에서 다형성이란, 한 타입의 참조변수로 여러 타입 객체를 참조하는것을 의미한다. 좀 더 자세한 의미로는 조상클래스 타입의 참조변수로 자손타입 인스턴스를 참조할 수 있다. 아래코드를 예시로 들어보자 class tv{ private boolean power; private int channel; tv(int channel){ this.channel = channel; } public boolean getPower(){ return this.power; } public int getChannel(){ return this.channel..
링크 : https://www.acmicpc.net/problem/10870 10870번: 피보나치 수 5 피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다. 이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가 www.acmicpc.net 피보나치 수열 문제이다. 피보나치 수열이란, 제 0항을 0, 제 1항을 1로 두고, 두번째 항부터 바로 앞의 두수를 더한 수로 놓는다.(F(2) = F(1) + F(0)). 피보나치 수를 상향식 분석하면 아래와 같다. 결론적으로 계속해서 f(n) = f(n-1) + f(n-2) 형태로 나아가는것을 볼 수 있다. 다만 주의해 줄 것이 있다. 피보나치 ..
링크 : https://www.acmicpc.net/problem/10872 10872번: 팩토리얼 0보다 크거나 같은 정수 N이 주어진다. 이때, N!을 출력하는 프로그램을 작성하시오. www.acmicpc.net 흔히 재귀문제의 대표적인 예시인 팩토리얼이다. 코드는 아래와 같다. 1. 일반적 재귀 def factorial(n): if n == 0: return 1 res = n * factorial(n-1) return res if __name__ == "__main__": inp = int(input()) print(factorial(inp)) 2. math.factoria사용 import math print(math.factorial(int(input())))
링크 : https://level.goorm.io/exam/43083/%EA%B3%84%EB%8B%A8-%EC%98%A4%EB%A5%B4%EA%B8%B0/quiz/1 구름LEVEL 코딩테스트에서 가장 높은 비중을 차지하는 알고리즘 문제를 제작하고 풀이할 수 있는 온라인 저지 서비스입니다. 기업에서 선호하는 C, C++, 파이썬(Python), 자바(Java), 자바스크립트(Javascript) 이 level.goorm.io 우선 문제를 분석해 보겠습니다. 계단을 최대 2칸 오를 수 있다고 할때 계단을 오르는 방법의 가짓수를 출력하는 프로그램을 작성하시오. n 이 3인경우 1. 1 - 2 - 3 2. 1 - 3 3. 2 - 3 이를 기반으로 그림으로 작성해 보면 아래와 같습니다. 내가 지은 결론은, 계단을..
재귀란? 재귀란 자기 자신을 재참조하는 형태의 알고리즘을 의미한다. 재귀의 장점 1. 피보나치수열, 팩토리얼과 같이 재귀적 표현이 자연스러운 해결에 대해서는 도움이 된다.(가독성) 2. 함수를 단순하게 만들어 준다 3. 변수사용을 줄여준다. 재귀의 단점 1. 메모리를 많이 차지하며 성능이 반복문에 비해 느리다.(함수 스택 call이 반복적으로 이루어지므로) 2. StackOverflow가능성이 크다 3. CPU 크래쉬를 발생시키기도 한다. 재귀의 대표적인 예시들 - Factorial def factorial(n : int) -> int: if n > 0: return n * factorial(n - 1) else: return 1 if __name__ == "__main__": n = int(input(..
Selenium을 이용해 chrominum web driver를 실행시키니까 ''chromedriver'는 Apple에서 악성 소프트웨어가 있는지 확인할 수 없기 때문에 열 수 없습니다' 라는 문구가 뜨면서 중간에 코드가 멈춘다. 이 오류가 나는 경우에는 chromedriver가 있는 디렉토리에서 아래 명령어를 입력해 주면 된다. 단 이 명령어는 해당 디렉토리에만 적용되므로, 만약 다른 디렉토리에 새로 chromedriver를 이동시켜 실행한다고 하면 해당 디렉토리에 가서 다시 명령어를 입력해 주어야 한다. xattr -d com.apple.quarantine chromedriver
약 1년전 한창 군머에서 제설하고 있을때 풀었던 스택 수열 문제를 다시 풀어보았습니다. 스택 수열은 '스택'주제와 관련된 문제이며 링크는 아래 첨부하겠습니다. https://www.acmicpc.net/problem/1874 1874번: 스택 수열 1부터 n까지에 수에 대해 차례로 [push, push, push, push, pop, pop, push, push, pop, push, push, pop, pop, pop, pop, pop] 연산을 수행하면 수열 [4, 3, 6, 8, 7, 5, 2, 1]을 얻을 수 있다. www.acmicpc.net 전에 어떻게 풀었는지 기억은 나지 않아 새로 푼다는 생각으로 풀어보았습니다. 우선 처음 문제 분석부터 해보도록 하겠습니다. 우선 입력과 출력은 아래와 같습니다..
Queue란? 큐는 스택과 동일하게 데이터를 임시 보관하는 자료구조이다. 다만 스택과 달리 선입선출(FIFO, First In Frist Out)구조를 가지고 있다. 큐에서 가지는 기본적인 작업은 아래 두개가 있습니다 인큐(Enqueue) : 데이터를 추가하는 작업 디큐(Dequeue) : 데이터를 빼내는 작업 그리고 스택의 구조에 쓰이는 용어도 두가지가 있습니다. 프런트(Front) : 데이터를 꺼내는 쪽 리어(Rear) : 데이터를 빼내는 쪽 Ring Buffer로 원형 큐 구현하기 일반적으로 배열형태로 큐를 구현하게 되면, 만약 디큐를 하게 되면 그 뒤 원소들을 모두 앞쪽으로 땡겨주어야합니다. 이 작업에서는 시간복잡도 O(n)이 추가적으로 들어가게 됩니다.디큐의 시간복잡도가 O(1)인데 이 작업으로..
스택(Stack이란?) 스택은 데이터를 임시저장할때 사용하는 자료구조이다. 기본적으로 후입선출(LIFO,Last In First Out)방식이다. 스택의 동작은 두가지가 있다 푸시(Push) : 데이터를 넣는 작업이다. 팝(Pop) : 데이터를 꺼내는 작업이다. 그리고 푸시, 팝을 하는 윗부분을 top, 아랫부분을 bottom이라고 한다. 스택 구현하기 스택을 구현해 보자. 우선 기본적으로 Fixed-Stack으로 구현해 보자. 스택을 구현하는데 있어 기본적으로 아래 세가지가 필요로 하다 스택배열 : stk - 데이터를 저장하는 본체이다 스택크기 : capactiy - 스택의 최대 크기를 나타내는 정수이다 스택포인터 : ptr - 스택에 쌓여있는 데이터 개수를 나타내는 정수값이다. 비어있으면 0, 차있으..
제어자는 클래스, 변수 또는 메소드 선언부에 함께 사용하여 의미를 부여해주는 역할을 한다 크게 두가지로 나누어 진다. 접근제어자 : public, protected, default, private 일반 제어자 : static, final, abstract, native,synchronized,... 제어자는 클래스나 멤버변수, 메소드에 주로 사용되며, 하나의 대상에 대해 여러 제어자를 조합해 사용할 수 있다. 단 접근 제어자는 한번에 네가지 중 하나만 선택해 사용할 수 있다. 대표적인 일반 제어자 1. static : 멤버변수, 초기화블록 , 메소드 static은 클래스의, 공통적인 이라는 의미를 가지고 있다. 이는 클래스 변수 혹은 클래스 메소드를 선언할 때 사용한다. 그리고 한가지 더, 초기화 블록..
super은 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조변수이다. this가 자신이 속한 인스턴스를 가리키는 것처럼 super는 자신의 부모 클래스에 대한 참조를 하는 변수이다. super또한 static으로 선언된 클래스 변수 / 메소드에 대해서는 사용할 수 없으며 인스턴스 변수 / 메소드에 대해서만 사용이 가능하다. class Parent1{ int x = 20; int y = 30; } class Child1 extends Parent1{ int y = 10; void method(){ System.out.println("x = " + x); System.out.println("this.x = " + this.x); System.out.println("super.x =..
오버라이딩이란 조상클래스로 부터 상속받은 메소드의 내용을 변경하는것을 말한다. 상속받은 메소드를 사용하기도 하지만, 자손클래스에서 자손클래스의 용도에 맞게끔 변경해야하는 경우 사용된다. class Points{ protected int x; protected int y; String getLocation(){ String msg = "X : " + this.x + " Y : " + this.y; return msg; } } class Point3D extends Points{ protected int z; @Override String getLocation(){ String msg = "X : " + this.x + " Y : " + this.y + " Z : " + this.z; return msg; ..
우선 아래 자바코드를 보자. 이 자바코드는 간단하게 랜덤 덱을 생성하고, 덱에서 랜덤 카드를 뽑는 기능을 하고 있습니다. 이 코드를 실행하고 보면 이러한 결과가 나옵니다 Card2@6bc7c054 class Card2{ static int typeNumber = 2; static int MaxNumber = 10; static String[] types = {"Spade","Heart","Diamond"}; private String Shape; private int Number; Card2(String Shape, int Number){ this.Shape =Shape; this.Number = Number; } Card2(){ this(types[(int)(Math.random() * typeNumb..
초기화 초기화란 변수를 선언하고 처음으로 값을 저장하는것을 의미한다. 이 초기화 작업은 상황에 따라 필수적이기도 하고 필수적이지 않기도 하다. 다만, 지역변수는 사용하기 전에 꼭 초기화를 해주는것이 좋다. 멤버변수의 초기화는 지역변수와 달리 여러가지 방법이 있다. 명시적 초기화(explicit initialization) 생성자(Constructor) 초기화 블록(Initializtion Block) 인스턴스 초기화 블록 : 인스턴스 변수를 생성할 때 마다 실행되는 블록 클래스 초기화 블록 : 클래스 변수에 대해 초기화를 수행하는 블록 명시적 초기화 명시적 초기화는 일반적인 변수선언과 똑같은 방식이다. 다른 초기화 방법들 중 가장 우선시 고려되는 방법이다. class test{ private int co..
자바에서 문자열 보간표현식을 쓰려면 java.text.MessageFormat을 사용하면 된다. String (변수명) = MessageFormat.format("{0}, {1}",(변수0),(변수1)); import java.text.MessageFormat; class Car{ private String color; private String gearType; private int door; Car(String c,String g, int d){ color = c; gearType = g; door = d; } String returnColor(){ return this.color; } String returnGearType(){ return this.gearType; } int returnDoor(..
JVM은 Java Virtual Machine의 약자로 자바 가상 머신이다. JVM은 시스템으로 부터 프로그램을 수행하는데 필요한 메모리를 할당받고 JVM은 이 메모리를 용도에 따라 영역으로 나눠 관리한다. 이 영역에는 크게 3가지가 있다. 메소드 영역, 콜스택 영역, 힙 영역. 각 영역의 역할은 아래와 같다 1. 메소드 영역 특정 클래스가 사용되면 해당 클래스 파일을 읽어 분석후 클래스에 대한 정보가 저장되는 곳이다. 클래스 변수 또한 이곳에 저장된다 2. 힙 영역 인스턴스가 생성되는 공간이다. 프로그램 실행중에 생성되는 인스턴스가 모두 이곳에 생성된다. 즉, 인스턴스 변수가 저장되는곳이라고 생각하면 된다. 3. 호출스택 메소드의 작업에 필요한 메모리 공간을 제공한다. 작업을 수행하는 중간에 저장되는 ..
자동으로 MingW를 사용해 C/C++환경을 자동으로 설정해주고, 프로젝트 관리해주는 툴을 제작했습니다! 관심있으신 분들은 아래 링크로 가주시면 됩니다! https://jhoplin7259.tistory.com/133 [Visual Studio Code 3rd Party Tool] MingW를 사용한 윈도우 VSCode C/C++ 개발환경 자동 세팅 및 프로젝트 관 이번에 만들어 본 프로그램은 윈도우 환경 Visual Studio Code에서 MingW를 사용하여 C/C++환경을 자동으로 설정해주고(Visual Studio Code의 C/C++ Recommended Extensions 설치와 환경변수 등록까지 수행합니다).. jhoplin7259.tistory.com 이번에는 Winodows에서 Visu..
· Toy Project
이번에 만들어 본 프로그램은 윈도우 환경 Visual Studio Code에서 MingW를 사용하여 C/C++환경을 자동으로 설정해주고(Visual Studio Code의 C/C++ Recommended Extensions 설치와 환경변수 등록까지 수행합니다) 프로젝트 관리까지 해주는 CLI툴을 만들어 보았습니다. 소스코드는 Open Source로 공개되며 아래 깃허브 링크로 들어가시면 됩니다. https://github.com/J-hoplin1/VSCode_C_CPP_Env_Initiator GitHub - J-hoplin1/VSCode_C_CPP_Env_Initiator: Visual Studio Code에서 C / C++ MingW64 개발환경을 자동으로 구축해 Visual Studio Code에서..
제 에어팟 2세대 배터리 효율이 죽어버렸습니다... 에어팟 유닛 케이스도 한번 유닛 충전을 하면 배터리가 방전되고, 유닛도 4~5시간이 가기도 하지만 간혹가다 갑자기 배터리가 20% 미만으로 되버리는 경우가 빈번히 발생하더군요 ㅠㅠ... 그냥 감수하고 쓰고 있었지만, 가면 갈수록 증상이 점점 심해지는거 같아서 비싸지만 새로 사야겠다 라는 생각을 하게되었습니다. 저는 에어팟 프로와 에어팟 3세대중 고민없이 에어팟 3세대로 결정했습니다. 사실 에어팟 프로를 잠깐 사용했었는데, 노이즈 캔슬링이나 음질은 매우 만족했지만(이거는 어떠한 이어폰보다 만족했습니다) 오른쪽 유닛이 충전이 아예 안되는 현상이 있다거나, 배터리 지속시간이 적고 통화 음질이 많이 떨어지고, 외이도염 증상이 나타나는 등 개인적으로 안좋았던 기..
Object,즉 객체는 변경이 가능한 값이다. 프로퍼티를 삭제, 읽기, 갱신, 쓰기, 재정의 등을 할 수 있다. 자바스크립트에서는 이 객체의 가변성에 제한을 줄 수 있는 메소드들을 제공한다. 아래와 같이 세가지가 존재한다 구분 메소드 프로퍼티 추가 프로퍼티 삭제 프로퍼티 값 읽기 프로퍼티 값 쓰기 프로퍼티 어트리뷰트 재정의 객체 확장금지 Object.preventExtensions X O O O O 객체 밀봉 Object.seal X X O O X 객체 동결 Object.freeze X X O X X 객체 확장 금지 객체 확장 금지는 Object.preventExtensions메소드로 객체 확장을 금지한다. 객체 확장을 금지한다는 것은 프로퍼티 추가하는것이 제한된다는 것을 의미한다. 프로퍼티 동적 추가,..
자바스크립트 엔진은 프로퍼티를 생성할 때 프로퍼티의 상태를 나타내는 프로퍼티 어트리뷰트를 기본값으로 정의하게 된다. 프로퍼티의 상태에는 아래 네가지가 존재한다 value 프로퍼티 값 writable 값 갱신 가능여부 enumeratable 열거 가능여부 configurable 재정의 가능여부 이는 자바스크립트 엔진에서 관리하는 내부슬롯 [[value]], [[writable]], [[enumerable]], [[configurable]]값들이다. 이 어트리뷰터에 직접적인 접근은 안되지만 Object.getOwnPropertyDescriptor메소드를 사용해서 간접적으로 확인할 수 있다. Object.getOwnPropertyDescriptor 메소드의 첫번째 매개변수에는 객체가, 두번째 매개변수는 프로퍼..
접근자 프로퍼티는 자체적으로 값을 갖지 않고 다른 데이터 프로퍼티의 값을 읽거나 저장할 때 사용하는 접근자 함수로 구성된 프로퍼티이다. 접근자 프로퍼티는 다음과 같은 프로퍼티 어트리뷰트를 갖는다 get 접근자 프로퍼티를 통해 데이터 프로퍼티 값을 읽을때 호출되는 접근자 함수이다.접근자 프로퍼티 키로 프로퍼티 값에 접근하면 프로퍼티 어트리뷰터 [[getter]]의 값, getter함수가 호출되는 것이다 set 접근자 프로퍼티를 통해 데이터 프로퍼티의 값을 저장할 때 호출되는 접근자 함수다. 접근자 프로퍼티 키로 값을 저장하면 프로퍼티 어트리뷰트의 [[setter]]의 값, setter함수가 호출되는 것이다. enumerable 데이터 프로퍼티의 enumerable과 동일한 성격 configurable 데이..
ES5+까지는 var로 변수를 선언했어야 하는 반면에 ES6부터는 var, let, const를 사용해서 변수를 선언할 수 있다. 여기서 가장 크게 var 과 let은 상수가 아닌 변수를 선언한다라는 공통점이 있지만, 서로간의 성격이 다르다. 결론부터 말하면 let은 var키워드가 가진 여러 단점들을 보완하기 위해 나타난 키워드라고 생각하면 된다. 그렇다면 어떤 차이점이 있을까? 1. 변수 중복 선언 금지 var키워드 같은 경우에는 중복 선언이 가능했었다. 하지만 let키워드는 중복선언이 되지 않는다. var a = 10; var a = 30; let b = 20; let b = 30; // Syntax Error 2. 블록 레벨 스코프 vs 함수 레벨 스코프 var 키워드 같은 경우에는 함수 레벨 스코..
자바스크립트에서 변수선언에 있어 키워드로 var, let, const가 있다. 그 중 var의 특성중 하나가 함수레벨 스코프이다. 일반적인 C,Java같은 언어에서는 함수 뿐만 아니라 모든 코드블록(반복문, 조건문 등) 에서 지역 스코프를 만들게 된다. 이러한 특성을 블록 레벨 스코프라고 한다. 자바스크립트에서 변수 선언문 let키워드가 블록레벨 스코프 성격을 띄고있다. 반면 자바스크립트에서 var 키워드 같은 경우에는 '함수의 코드 블록'만 지역 스코프로 인정하게 된다. 이러한 특성을 함수레벨 스코프라고 한다. 예시를 들어보면 아래와 같이 들 수 있다. var a = 10; for(var i = 0;i < 3; i++){ var a = i; console.log(i); // 0 1 2 } functio..
버블 정렬은 이웃한 두 원소의 관계를 비교해, 필요에 따라 교환을 반복하는 알고리즘입니다.버블정렬은 '단순 교환 정렬' 이라고 부르기도 합니다. 우선 버블 정렬의 교환 방식을 그림으로 살펴보겠습니다 버블정렬은 기본적으로 이웃된 원소들간의 비교, 교환이 일어나기 때문에, 안정적인 정렬이라고 할 수 있습니다. 이제 한번 그림을 같이 보겠습니다.총 길이 6인 리스트가 있습니다. 이 리스트에서 한번의 정렬을 위해서 (총 길이) - 1번만큼의 비교, 교환이 이루어 지는것을 볼 수 있습니다. 그리고 참고로 버블 정렬에서 일어나는 비교,교환 과정을 '패스'라고 부릅니다. 자 그럼 일단 코드를 작성해 봅시다. 우선 총 길이에 대해 -1 번만큼 교환이 일어난다고 했죠? 아래와 같이 작성해 줍니다. from typing ..
취미로 하고싶은 무언가를 정하고 싶어서 곰곰히 생각해 보다가 이미 애플로 도배된걸 보고, IOS프로그래밍에 접근해 보고싶었습니다. IOS프로그래밍을 위해서는 Swift 혹은 Objective - C를 사용해야하는데, Objective - C는 레거시 느낌이고 최근에는 Swift 4,5를 주로 씁니다. 그냥 취미로 하는것이기에 깊게 들어가진 않을꺼고... 그냥 생각나면 뭔가 만들수 있을정도의 숙련도만 기르려고 합니다. iOS개발이 아닌 Swift만 하기 위해서는 Linux Ubuntu 혹은 Mac OS가 필요합니다. 단, iOS개발을 하기 위해서는 맥 계열의 컴퓨터가 필요하니 참고하자. ubuntu에서 swift 실행을 위해서는 아래 링크에 있는 방법을 참고하고, 맥 계열에서 swift를 실행하기 위해서는..
자바스크립트의 변수타입에는 두가지가 있다 원시타입(Primitive Type) 참조타입(Reference Type) 원시타입은 자바스크립트의 기본 자료형들이 포함되어있다. 예를 들어 string, int, boolean, undefined등등 이 있으며, 원시타입같은 경우에는 메모리 크기가 변수할당될때 고정으로 할당되며, 저장된 값을 직접 가리키는 구조로 되어있다. 또한 원시타입 값들은 불변성(값이 변하지 않음)이라는 특징도 있다. 재할당( 변수 = value )의 형태도 기존 변수가 직접 가리키는 메모리 주소의 값이 바뀌는게 아닌 메모리에 새로운 값이 고정으로 할당되어 직접 가리키는 값이 달라지는 원리이다. 이 원시타입을 제외한 나머지를 참조타입이라고 한다. 참조타입을 흔히 '객체'라고 부르며, 원시타..
프로그래머스 문제를 풀었다. https://programmers.co.kr/learn/courses/30/lessons/42587 코딩테스트 연습 - 프린터 일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린 programmers.co.kr 결론적으로 내가 작성한 코드는 아래와 같다 from typing import Any, Sequence from collections import deque from random import randint class PriorityPrint(object): def __init__(self,seq,location): self.location..
나스를 구매했습니다. 나스를 구매한 이유는 여러가지 이유가 있는데, 그중 하나는 동기들이랑 하는 게임들의 게임서버를 구동시키는것 또한 이유중 하나였습니다. 오늘은 시놀로지 나스에서 마인크래프트 서버 여는 과정을 한번 정리해 보겠습니다 제 나스의 스펙을 아래에 정리해 드리겠습니다 - Synology NAS DS 720+ (2bay, Intel Celeron J4125) - Storage : 4tb + 4tb / RAID 1 - RAM : 10GB(2GB + 8GB, 참고로 16GB는 인식이 되지 않습니다) 제가 알기로는 DS 215j등 일부 모델에서는 사양 부족으로 인해 구축이 안되는거로 알고있습니다. 모든 모델에서 구축되지 않을수 있다는점 참고해주시면 감사하겠습니다. 1. 나스에 도커 설치 및 이미지 활..
· Discord Bot
사용방법은 맨 밑에 있습니다. 깃허브 주소 : https://github.com/J-hoplin1/League-Of-Legend-Search-Bot/tree/master/Riot%20API%20Version J-hoplin1/League-Of-Legend-Search-Bot 디스코드 봇 : LOL 전적 봇. Contribute to J-hoplin1/League-Of-Legend-Search-Bot development by creating an account on GitHub. github.com 약 1년 전에 롤 전적검색 디스코드 봇을 만들었습니다.(아래링크) https://jhoplin7259.tistory.com/92?category=927506 디스코드 봇(Discord Bot) : 리그오브레전..
Hoplin
Hoplin의 개발일기