2025-06-13 추가 공부

Suhyeon Lee·2025년 6월 13일

Mojo

  • 파이썬 생태계를 받아들인 Mojo 라는 인공지능 전용 언어
    • 지금은 사용성이 많이 떨어지지만 파이썬보다 20000배 빠르다는 벤치마킹 결과가 있어 한때 세간에서 주목을 받았던 언어가 있는데요. 파이썬 문법 잘 배워놓고 잘쓰고있으면 이런 언어들도 나중에 경험할 수 있지 않을까 합니다.

클래스, 객체, 인스턴스

  • 예시
/* 클래스 */
public class Animal {
  ...
}
/* 객체와 인스턴스 */
public class Main {
  public static void main(String[] args) {
    Animal cat, dog; // '객체'

    // 인스턴스화
    cat = new Animal(); // cat은 Animal 클래스의 '인스턴스'(객체를 메모리에 할당)
    dog = new Animal(); // dog은 Animal 클래스의 '인스턴스'(객체를 메모리에 할당)
  }
}
  • 클래스, 객체, 인스턴스의 차이
    • Class vs. Object
      • 클래스는 '설계도', 객체는 '설계도로 구현한 모든 대상'
    • Object vs. Instance
      • 클래스의 타입으로 선언되었을 때 객체라고 부르고, 그 객체가 메모리에 할당되어 실제 사용될 때 인스턴스라 부름
      • 객체는 현실 세계에 가깝고, 인스턴스는 소프트웨어 세계에 가까움
      • 객체는 '실체', 인스턴스는 '관계'에 초점 → 객체를 "클래스의 인스턴스"라고도 부름
      • '방금 인스턴스화하여 레퍼런스를 할당한' 객체를 인스턴스라고 말하지만 이는 원본(추상적 개념)으로부터 생성되었다는 것에 의미를 부여하는 것 → 엄격하게 객체와 인스턴스를 나누기는 어려움
  • 추상화 기법
    • 분류(Classification)
      • 객체 → 클래스
      • 실재하는 객체의 구체적인 세부 사항을 숨기고 공통적인 속성을 공유하는 범주 또는 추상적인 개념으로 묶음
    • 인스턴스화(instantiation)
      • 클래스 → 객체
      • 분류의 역(반대 개념)
      • 범주나 개념으로부터 실재하는 객체를 만드는 과정
      • 구체적으로 클래스 내의 객체에 대해 특정한 변형을 정의하고 이름을 붙인 다음 물리적인 어떤 장소에 위치시키는 등의 작업을 통해 인스턴스를 만듦
      • 예시(Exemplification)라고도 부름

할당과 복사

  • 할당(Assignment)
    • 변수에 값을 대입하는 작업
    • a = b와 같은 할당 연산 → a는 b가 가리키는 객체의 참조를 가짐
      • 즉, a와 b는 같은 객체를 가리킴
    • a = 10: 변수 a에 정수 10을 할당
      • a는 10이라는 값을 가진 정수 객체를 참조하게 됨
    • a를 변경하면 b도 함께 변경됨
    • a is b로 비교하면 True가 됨

할당은 객체를 새로 생성하는 것이 아니라 객체에 대한 참조를 만들어내는 작업

  • 얕은 복사(Shallow Copy)
    • 원본 객체의 내용을 새로운 객체로 복사하지만 내부에 있는 객체들은 동일한 객체를 참조함
    • 즉, 얕은 복사를 한 경우 원본 객체와 복사본 객체는 동일한 객체를 참조하게 됨
      • 따라서 하나의 객체를 변경하면 다른 객체에도 영향을 줄 수 있음

a와 b_2, b_3 리스트는 서로 다른 리스트 객체이지만(얕은 복사), 내부의 "[3, 4] 리스트" 는 동일한 객체를 참조함: b_2, b_3 리스트에서 내부 리스트([3,4])의 요소를 변경하면 a 리스트에도 영향을 줌

  • 깊은 복사(Deep Copy)
    • 원본 객체의 내용을 새로운 객체로 복사하는 것
    • 내부에 있는 객체들도 모두 새로 생성하여 복사
    • 원본 객체와 복사본 객체는 완전히 독립된 객체가 되며, 한 객체의 변경이 다른 객체에 영향을 미치지 않음

'깊은 복사'는 pandas 라이브러리에도 내장되어 있음(copy() 메서드)
→ 원본 데이터프레임에 영향을 주지 않고 복사본을 이용해 자유롭게 데이터 조작 및 분석을 위한 전처리를 진행하기 위함

파이썬에서 클로저란

  • 클로저(Closure)
    • 함수 내부에 정의된 또 다른 함수가 외부 함수의 변수를 참조하고, 그 참조를 유지하는 개념
      (중첩 함수에서 내부 함수가 외부 함수의 변수를 참조)
    • 핵심은 내부 함수가 외부 함수의 변수를 "기억"하고, 그 환경에 접근할 수 있는 능력 → 외부 함수가 실행을 마치고 종료되더라도, 내부 함수는 외부 함수의 변수를 계속해서 사용: 변수 스코프 및 생명 주기
      • Python에서 변수는 해당 변수가 정의된 함수의 지역 스코프(Local Scope)에서만 유효
      • 일반적으로 함수가 종료되면 해당 스코프에 정의된 모든 변수는 메모리에서 제거됨
      • 그러나 클로저를 사용하면 내부 함수가 외부 함수의 변수를 참조할 수 있고, 해당 변수의 생명 주기가 연장됨
  • 구현
    • Python에서 클로저는 함수 객체의 closure 속성을 통해 구현
      • 내부 함수가 참조하는 외부 함수의 변수를 저장하는 튜플
      • 이를 통해 내부 함수가 외부 함수의 변수를 계속 참조할 수 있음
def make_counter():
    count = 0

    def counter():
        nonlocal count
        count += 1
        return count

    return counter

counter1 = make_counter()
counter2 = make_counter()

print(counter1())  # 출력: 1
print(counter1())  # 출력: 2
print(counter2())  # 출력: 1
print(counter1())  # 출력: 3

위 예제에서 make_counter 함수는 클로저를 반환합니다. 내부 함수 counter는 외부 함수의 count 변수를 참조하고 변경합니다. nonlocal 키워드를 사용하여 외부 함수의 count 변수를 참조하도록 지정합니다. 이를 통해 각각의 카운터가 독립적인 상태를 유지하며 작동합니다.

def outer_function(arg):
    value = "외부 함수 변수"

    def inner_function():
        return arg + value  
    # 내부 함수는 외부 함수 변수 arg, value에 접근 가능

    return inner_function

# 클로저 생성
closure_function = outer_function("외부 인자 ")

# 클로저 실행
result = closure_function()

print(result)  # 출력: 외부 인자  외부 함수 변수

클로저가 되기 위한 조건:
1. 내부 함수여야 한다.
2. 외부 함수의 변수를 참조해야 한다.
3. 외부 함수가 내부 함수를 반환해야 한다.

veo

  • 구글 딥마인드에서 공개한 멀티모달 기반 생성형 영상 인공지능.
profile
2 B R 0 2 B

0개의 댓글