/* 클래스 */
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 클래스의 '인스턴스'(객체를 메모리에 할당)
}
}
a = b와 같은 할당 연산 → a는 b가 가리키는 객체의 참조를 가짐a = 10: 변수 a에 정수 10을 할당a is b로 비교하면 True가 됨할당은 객체를 새로 생성하는 것이 아니라 객체에 대한 참조를 만들어내는 작업

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

'깊은 복사'는
pandas라이브러리에도 내장되어 있음(copy()메서드)
→ 원본 데이터프레임에 영향을 주지 않고 복사본을 이용해 자유롭게 데이터 조작 및 분석을 위한 전처리를 진행하기 위함
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. 외부 함수가 내부 함수를 반환해야 한다.