분류 전체보기
-
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 이후 실행될 것입니..
-
Blocking/Non-Blocking Sync/Async개발/컴퓨터사이언스 2023. 1. 26. 17:28
Blocking/Non-Blocking Blocking, Non-Blocking은 제어권을 처리하는 방법론이다. Blocking은 현재의 작업이 모두 끝난후에 다음 작업에게 제어권을 넘겨준다. 예를 들어 Blocking 방식으로 CPU가 I/O 작업을 처리한다면 CPU는 I/O 작업이 완료 될 때까지 다른 업무를 하지 않는다. Non Blocking은 이와 반대다. 현재 작업이 모두 끝나지 않더라도 다른 작업에게 제어권을 건네줄 수 있다. CPU가 I/O 작업을 모두 처리하지 않더라도 다른 작업에게 제어권을 넘겨준다면 Non-Blocking이다. Sync/Async 작업의 결과값을 신경 쓰느냐 쓰지 않느냐와 관련 있다. Sync는 호출된 함수의 결과를 호출한 함수가 신경 쓴다. 함수의 리턴 값이 필요한 ..