개발
-
자바 - Garbage Collector개발 2023. 2. 24. 16:00
JVM은 Garbage Collector (GC) 를 이용해서 Heap 메모리를 주기적으로 청소한다. GC는 사용하지 않는 객체를 확인하고 삭제해 메모리 공간을 확보하는 역할을 한다 객체가 GC의 대상이 되는 경우는 크게 두가지다. 객체를 참조하는 레퍼런스가 null로 세팅되는 경우 객체를 참조하는 레퍼런스의 범위가 종료되는 경우 (예로 함수 블럭 내에서 실행을 모두 완료하는 경우나 등등) 간단한 예제를 살펴보자. stack 메모리상에 있는 지역변수가 없어지면 그에 상응하는 객체는 더이상 쓸모가 없으므로 GC의 대상이 된다고 본다. 물론 다른 곳에서 참조하고 있다면 GC의 대상이 아니다. class House() {} class Person {} fun main() { val house = House()..
-
JAVA - 직렬화, 역직렬화개발 2023. 2. 24. 15:13
직렬화, 역직렬화 자바의 직렬화는 객체를 바이트의 연속으로 변환시키는 기술이다. 역직렬화는 반대로 바이트의 연속을 오브젝트로 전환해주는 기술이다. 직렬화된 객체가 파일에 기록되면 역직렬화를 통해 파일에서 읽어온 데이터를 메모리에서 객체로 쓸 수 있다. 이렇게 인터뷰용 답변만 준비하지말고 직접 코딩해서 체험해보는게 좋다. Person이라는 클래스를 직렬화해서 file.ser이라는 파일에 바이트코드를 써보자. data class Person(val name: String, val age: Int) : Serializable try { val person = Person(name = "ryan", age = 30) val fileOut = FileOutputStream("file.ser") val objOut..
-
JAVA - 다중상속을 허용하지 않는 이유는 뭘까?개발/기술 2023. 2. 24. 12:59
최근 면접에서 "Java가 다중상속을 허용하지 않는 이유는 뭘까요?" 라는 질문을 받았다. 상속은 오직 클래스 하나만 가능하다는 문법만 알았지 그 이유에 대해서 깊게 고민해보지는 않았다. "인터페이스는 다중으로 구현할 수 있는데, 상속만 이렇게 막은 이유가 있을까요?" 라는 추가질문이 이어지자 제대로 답변도 못하고 '정말 그렇네... 왜그렇게 만들었을까...?' 라는 생각이 면접을 마치고 집에 와서도 머릿속을 멤돌았다. java class 는 암시적으로 object 클래스를 상속하고 있다. 대부분의 클래스에서 기본으로 포함된 함수 toString(), hashCode(), equals() 가 object 로부터 상속받은 함수들이다. 클래스 상속 관계에선 위 함수들은 어떻게 처리될까? public clas..
-
Flask SQLAlchemy vs SQLAlchemy개발 2023. 2. 14. 21:22
파이썬을 서비스를 개발할 때 ORM은 SQLAlchemy 말고 딱히 다른 옵션이 없다. 그런데 Flask 개발자는 일반 SQLAlchemy와 Flask에 최적화된 Flask-SQLAlchemy 중 한가지를 골라야한다. 사실 이 두가지는 완전히 다른 라이브러리는 아니다. Flask SQLAlchemy는 기존 SQLAlchemy에서 일부를 가져와 Flask에 맞게 바꾼 형태다. 세부적으로 말하면 Flask-SQLAlchemy는 세션 관리를 app 컨텍스트에 맞춰 관리해주기 때문에 편하다. 반면 SQLAlchemy를 사용하는 경우에는 세션 관리를 개발자가 직접 해야한다. SQLAlchemy를 사용하는 경우 코드는 아래처럼 짜게 된다. SQLALCHEMY_DATABASE_URL = "postgresql://co..
-
Python - namedtuple개발 2023. 2. 14. 18:23
namedtuple 파이썬에서 튜플은 컴마로 나눠진 데이터의 집합을 말한다. 예로 이런 것들은 모두 튜플이다 data: Tuple[str | int, ...] = (1, 2, 4, "Geek") 튜플은 배열처럼 index로 접근할 수 있으나 Dict처럼 개별 값에 대한 키 값이 없다보니 관리하는게 쉽지 않다. 그래서 파이썬에서는 namedtuple 걸 사용해 필드 값을 설정할 수 있게 했다. from collections import namedtuple Point = namedtuple("Point", ["x", "y"]) point = Point(x=3, y=4) 결과 값은 다음과 같이 나온다. 필드 명에 따라서 값 접근이 가능하기 때문에 더 직관적으로 값을 받을 수 있다. print(point) pr..
-
Python - 데코레이터개발 2023. 2. 14. 16:09
Decorator 파이썬에서는 함수에 데코레이터라는 기능을 추가할 수 있다. 함수가 실행 될 때 다른 함수를 타도록 만드는 기능이다. def to_upper_text(func): text = func() if not isinstance(text, str): raise TypeError("not a string type") return text.upper() @to_upper_text def say(): return "welcome" say 함수 위에 @to_upper_text 라는 데코레이터를 추가했다. 데코레이터 안에서는 전달 받은 func() 함수의 결과 값이 str인지 확인하고 아니면 에러를 호출, 맞으면 upper 함수를 호출해서 대문자로 리턴한다. WELCOME 실행하면 대문자로 바뀌어서 출력된..
-
Nodejs Blocking/Non-Blocking,개발 2023. 1. 26. 17:33
노드제이에스에서 Blocking은 자바스크립트의 실행을 위해 자바스크립트 작업이 아닌(non-JavaScript operation)의 작업이 끝날 때 까지 기다려야 하는 것을 말한다. 주로 I/O 작업의 실행을 위해 기다릴 때 Blocking 이 생긴다. libuv를 사용하는 노드 제이에스 동기 메서드가 대표적인 블로킹 작업이다. 표준 라이브러리의 I/O에서는 대체로 Blocking 메서드와 Non-Blocking 메서드를 모두 제공한다. const fs = require('fs'); const data = fs.readFileSync('/file.md'); // 파일을 읽을 때까지 여기서 블로킹됩니다. console.log(data); moreWork(); // console.log 이후 실행될 것입니..