파이썬 프로그래밍 면접 질문과 답변

미남잉·2024년 12월 11일
0

출처: Top 50 Python Programming Interview Questions With Answers

파이썬 프로그래밍 관련 인터뷰 질문 모음을 정리하였습니다.

Python 기초 및 주요 기능

1. 리스트와 세트의 차이점은 무엇인가요?

  • 답변: 리스트는 순서를 유지하고 중복을 허용하지만, 세트는 순서가 없고 중복을 허용하지 않습니다.
my_list = [1, 2, 2, 3, 4]  # 중복 허용
my_set = {1, 2, 3, 4}  # 중복 없음

2. 파이썬의 collections 모듈의 목적은 무엇인가요?

  • 답변: collections 모듈은 특화된 컨테이너 데이터 타입을 제공합니다.
p# 예: Counter를 사용한 발생 횟수 계산
from collections import Counter
result = Counter("abracadabra")
print(result)  # Counter({'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1}

3. 파이썬에서 예외는 어떻게 처리하나요?

  • 답변: try-except 블록을 사용합니다.
try:
    result = 10 / 0
except ZeroDivisionError as e:
    print(f"Error: {e}")

4. GIL(Global Interpreter Lock)이란 무엇이며 멀티스레딩에 어떤 영향을 미치나요?

  • 답변: GIL은 파이썬 객체에 대한 스레드 간 동시 접근을 방지하는 메커니즘으로, 여러 네이티브 스레드가 동시에 파이썬 바이트 코드를 실행하지 못하게 합니다. 이는 CPU 바운드 작업에서 멀티스레딩의 성능을 저하시킬 수 있습니다.

5. 파이썬에서 메모리는 어떻게 관리되나요?

  • 답변: 파이썬은 프라이빗 힙 공간을 사용하며, 메모리 관리자는 자동으로 메모리를 할당/해제합니다. 가비지 컬렉터는 사용되지 않는 메모리를 회수합니다.
# 자동 메모리 관리 예
my_list = [1, 2, 3]

6. 파이썬의 __init__ 메서드의 목적은 무엇인가요?

  • 답변: __init__은 객체가 생성될 때 호출되는 생성자 메서드로, 객체의 속성을 초기화합니다.
class MyClass:
    def __init__(self, value):
        self.value = value

obj = MyClass(42)
print(obj.value)  # 42

7. 얕은 복사(Shallow Copy)와 깊은 복사(Deep Copy)의 차이점은 무엇인가요?

  • 답변:
    • 얕은 복사는 새로운 객체를 생성하지만, 중첩된 객체는 복사하지 않습니다.
    • 깊은 복사는 모든 객체를 재귀적으로 복사합니다.
import copy

original_list = [[1, 2, 3], [4, 5, 6]]
shallow_copy = copy.copy(original_list)  # 중첩 객체는 참조
deep_copy = copy.deepcopy(original_list)  # 중첩 객체까지 복사

8. 파이썬에서 예외 처리는 어떻게 작동하나요?

  • 답변: try, except, finally 블록을 사용합니다.
    • try: 실행 코드.
    • except: 예외 발생 시 실행 코드.
    • finally: 예외 여부와 관계없이 항상 실행.
try:
    result = int("abc")
except ValueError as e:
    print(f"Error: {e}")

9. 파이썬의 map 함수와 filter 함수의 목적은 무엇인가요?

  • 답변:
    • map: 입력 리스트의 모든 요소에 함수를 적용.
    • filter: 조건을 만족하는 요소만 필터링.
numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, numbers))  # [1, 4, 9, 16, 25]
even = list(filter(lambda x: x % 2 == 0, numbers))  # [2, 4]

10. 파이썬의 리스트 컴프리헨션 개념을 설명해주세요.

  • 답변: 리스트 컴프리헨션은 리스트를 간결하게 생성하는 방법으로, 표현식 뒤에 for 또는 if 문을 포함할 수 있습니다.
squared = [x**2 for x in range(5) if x % 2 == 0]  # [0, 4, 16]

Amazon Python 인터뷰 질문

1. 파이썬은 다중 상속을 어떻게 지원하나요?

  • 답변: 파이썬은 한 클래스가 여러 부모 클래스를 상속받을 수 있게 하여, 모든 부모 클래스의 속성과 메서드를 물려받도록 지원합니다.
class A:
    pass

class B:
    pass

class C(A, B):
    pass

2. 파이썬의 with 문은 무엇을 위해 사용되나요?

  • 답변: 리소스 관리 목적으로 사용됩니다. 리소스를 열고 닫는 작업을 자동으로 처리하여 코드 안정성을 높입니다.
with open('example.txt', 'r') as file:
    content = file.read()

3. 파이썬에서 데코레이터의 사용 목적은 무엇인가요?

  • 답변: 데코레이터는 함수나 메서드의 동작을 수정하거나 확장하는 방법으로, 코드 재사용성과 가독성을 높이는 데 사용됩니다.
def my_decorator(func):
    def wrapper():
        print("함수 실행 전")
        func()
        print("함수 실행 후")
    return wrapper

@my_decorator
def say_hello():
    print("Hello!")

say_hello()

4. 파이썬의 가비지 컬렉션은 어떻게 작동하나요?

  • 답변: 파이썬은 참조 카운팅과 세대별 가비지 컬렉션을 사용하여 더 이상 참조되지 않는 객체를 자동으로 메모리에서 제거합니다.

5. 리스트에 아이템을 추가할 때 appendextend의 차이점은 무엇인가요?

  • 답변:
    • append: 요소를 리스트 하나로 추가.
    • extend: 요소를 각각의 개별 요소로 추가.
ids1 = [1, 2, 3]
ids2 = [4, 5]

ids1.append(ids2)  # [1, 2, 3, [4, 5]]
ids1.extend(ids2)  # [1, 2, 3, 4, 5]

6. Pandas 데이터 프레임에서 결측값을 어떻게 처리하나요?

  • 답변:Pandas에서는 dropna()fillna() 메서드를 사용하여 결측값을 처리할 수 있습니다.
# 결측값이 포함된 행 제거
df_cleaned = df.dropna()

# 결측값을 특정 값(예: 평균)으로 대체
df_filled = df.fillna(df.mean())

7. 파이썬의 lambda 함수의 목적은 무엇인가요?

  • 답변:
    • lambda 함수익명 함수를 생성하는 데 사용됩니다.
    • 짧고 간단한 작업에 적합하며, 주로 map, filter, sort 같은 함수에서 사용됩니다.
# 예제: lambda 함수 사용
square = lambda x: x**2
result = square(5)  # 25 출력

8. 파이썬에서 파일 I/O를 어떻게 처리하나요?

  • 답변:파일 I/O는 open() 함수를 사용하여 파일을 열고, read(), write(), close() 메서드로 파일을 읽거나 쓸 수 있습니다.
# 파일 읽기 예제
with open('example.txt', 'r') as file:
    content = file.read()
  • 장점: with 문을 사용하면 파일이 자동으로 닫힙니다.

9. HTML에서 Amazon 제품 정보를 가져오는 스크립트를 작성해주세요.

  • 답변:
    • BeautifulSoup 라이브러리를 사용하여 HTML을 파싱하고, requests를 사용해 웹페이지의 HTML을 가져올 수 있습니다.
    • 아래는 제품 제목, 가격, 평점을 가져오는 예제입니다.
import requests
from bs4 import BeautifulSoup

def get_product(url):
    try:
        # HTML 가져오기
        resp = requests.get(url)
        resp.raise_for_status()  # HTTP 오류 발생 시 예외 처리

        # HTML 파싱
        soup = BeautifulSoup(resp.content, 'html.parser')

        # 제품 정보 추출
        title = soup.find('span', {'id': 'productTitle'}).get_text(strip=True)
        price = soup.find('span', {'id': 'priceblock_ourprice'}).get_text(strip=True)
        rating = soup.find('span', {'class': 'a-icon-alt'}).get_text(strip=True)  # HTML 구조에 따라 조정 필요
        return {'title': title, 'price': price, 'rating': rating}

    except requests.RequestException as req_err:
        print(f"요청 오류: {req_err}")
    except Exception as err:
        print(f"오류 발생: {err}")

    return None

# 함수 실행 예제
if __name__ == "__main__":
    prod_url = "https://www.amazon.com/example-product-url"

    prod_info = get_product(prod_url)

    if prod_info:
        print("제품 정보:")
        print(f"제목: {prod_info['title']}")
        print(f"가격: {prod_info['price']}")
        print(f"평점: {prod_info['rating']}")

10. 파이썬의 __str____repr__ 메서드의 목적은 무엇인가요?

  • 답변:
    • __str__: 사람이 읽기 쉬운 형식의 문자열 표현을 반환합니다. 주로 print() 함수에서 사용됩니다.
    • __repr__: 객체의 디버깅이나 재현 가능한 표현을 반환합니다.
# 예제: __str__ 및 __repr__ 메서드
class MyClass:
    def __str__(self):
        return "이 객체는 MyClass입니다"

    def __repr__(self):
        return "MyClass()"

obj = MyClass()
print(obj)  # "이 객체는 MyClass입니다" 출력
print(repr(obj))  # "MyClass()" 출력

Microsoft Python 프로그래밍 인터뷰 질문


1. 파이썬의 리스트 컴프리헨션이 프로그래머가 리스트를 생성하는 방식을 어떻게 더 간편하게 만드나요?

  • 답변:리스트 컴프리헨션은 반복문조건 필터링을 단일 코드 라인으로 결합해 리스트를 생성하는 간결한 방법을 제공합니다.
# 기존 방식
high_scores = []
for player in players:
    if player.status == "active":
        high_scores.append(player.score)

# 리스트 컴프리헨션
high_scores = [player.score for player in players if player.status == "active"]
  • 장점: 코드가 간결하고 읽기 쉬움.

2. 파이썬에서 생성자를 사용해 Azure 로그 파일을 메모리 효율적으로 처리하는 방법은 무엇인가요?

  • 답변:생성자(Generator)는 메모리에 모든 데이터를 로드하지 않고 한 줄씩 파일을 읽어 처리할 수 있습니다.
def read_log(file_path):
    with open(file_path, 'r') as log_file:
        for line in log_file:
            yield line.strip()

# 사용 예
log_gen = read_log("path/azure.log")
for line in log_gen:
    print(line)
  • 장점: 대규모 파일을 처리할 때 메모리 사용량 최소화.

3. 파이썬에서 여러 예외를 어떻게 처리하나요?

  • 답변:여러 예외를 처리할 때는 except 절에 예외를 튜플로 지정하거나 일반적인 except 절로 모든 예외를 포착할 수 있습니다.
try:
    result = 10 / 0
except (ZeroDivisionError, ValueError) as e:
    print(f"Error: {e}")

4. 파이썬의 super() 함수의 목적은 무엇인가요?

  • 답변:super() 함수는 부모 클래스의 메서드를 호출하는 데 사용됩니다.
    • 주로 자식 클래스의 __init__ 메서드에서 부모 클래스의 초기화를 호출할 때 사용됩니다.
class Parent:
    def __init__(self):
        print("Parent 클래스 초기화")

class Child(Parent):
    def __init__(self):
        super().__init__()
        print("Child 클래스 초기화")

obj = Child()

출력

Parent 클래스 초기화  
Child 클래스 초기화

5. 파이썬의 enumerate 함수는 어떻게 사용되나요?

  • 답변:enumerate 함수는 시퀀스를 반복하면서 인덱스와 요소를 동시에 추적할 수 있습니다.
fruits = ['apple', 'banana', 'orange']
for index, fruit in enumerate(fruits):
    print(f"Index: {index}, Fruit: {fruit}")

출력

Index: 0, Fruit: apple  
Index: 1, Fruit: banana  
Index: 2, Fruit: orange

6. 파이썬의 생성자(Generator)와 일반 함수의 차이점은 무엇인가요?

  • 답변:
    • 생성자는 데이터를 하나씩 반환하며, yield 키워드를 사용합니다.
    • 일반 함수는 데이터를 한 번에 반환하며, return 키워드를 사용합니다.
# 생성자 예제
def my_generator():
    yield 1
    yield 2
    yield 3

gen = my_generator()
for value in gen:
    print(value)

출력

1  
2  
3

7. 파이썬은 멀티스레딩을 어떻게 지원하나요?

  • 답변:파이썬은 threading 모듈을 통해 멀티스레딩을 지원합니다.그러나 GIL(Global Interpreter Lock) 때문에 멀티스레딩은 I/O 바운드 작업에 더 적합합니다.
import threading

def my_function():
    print("Thread 실행")

thread = threading.Thread(target=my_function)
thread.start()

8. 파이썬의 @property 데코레이터는 무엇인가요?

  • 답변:@property 데코레이터는 메서드를 읽기 전용 속성처럼 사용할 수 있게 만듭니다.
class MyClass:
    def __init__(self):
        self._value = 42

    @property
    def value(self):
        return self._value

obj = MyClass()
print(obj.value)  # 42 출력

9. 파이썬에서 NumPy의 목적과 NumPy 배열 생성 예시는 무엇인가요?

  • 답변:NumPy는 수치 계산다차원 배열 처리를 위한 라이브러리입니다.
import numpy as np
arr = np.array([0.1, 0.2, 0.3])
print(arr)  # [0.1 0.2 0.3]

10. 파이썬의 __name__ 변수의 목적은 무엇인가요?

  • 답변:__name__ 변수는 스크립트가 직접 실행 중인지 또는 모듈로 임포트되었는지를 판별하는 데 사용됩니다.
if __name__ == "__main__":
    print("이 스크립트는 메인 프로그램으로 실행되고 있습니다.")

Facebook Python 프로그래밍 인터뷰 질문


1. CSV 파일을 Pandas 데이터프레임으로 읽어오는 방법은 무엇인가요?

  • 답변: pd.read_csv() 함수를 사용하여 CSV 파일을 Pandas 데이터프레임으로 읽어올 수 있습니다.
import pandas as pd
df = pd.read_csv('example.csv')

2. 데이터프레임에서 ‘Salary’ 열이 50000보다 큰 행을 필터링하는 코드는 무엇인가요?

  • 답변: 부울 인덱싱(Boolean Indexing)을 사용하여 조건을 만족하는 행을 필터링할 수 있습니다.
import pandas as pd

df_filtered = df[df['Salary'] > 50000]
print(df_filtered)

3. 파이썬의 zip 함수는 어떻게 여러 리스트의 요소를 결합하나요?

  • 답변:zip 함수는 여러 이터러블의 대응 요소를 짝지어 새로운 튜플 이터레이터를 생성합니다.
hairstype = ["long", "short", "curly"]
eyecolor = ["blue", "green", "brown"]

# 결합 생성
combos = zip(hairstype, eyecolor)

# 결과 출력
for i, (hair, eye) in enumerate(combos, start=1):
    print(f"{i} {hair} hair and {eye} eyes"
  • 출력:
    1 long hair and blue eyes
    2 short hair and green eyes
    3 curly hair and brown eyes

4. Facebook 게시글 데이터에서 자주 함께 등장하는 단어를 효율적으로 찾는 알고리즘을 설계하세요.

  • 답변:아래 알고리즘은 동시 발생 단어 쌍(co-occurrence pairs)을 찾습니다.
    • 단계:
      1. 각 게시글의 단어로 조합 생성.
      2. 각 조합의 발생 횟수를 카운트.
from collections import defaultdict as dd
from itertools import combinations as comb

def gen_word_mtx(posts):
    mtx = dd(int)

    for post in posts:
        words = post.split()
        for pair in comb(set(words), 2):
            mtx[pair] += 1
    return mtx

def word_pairs(mtx, threshold):
    return [pair for pair, count in mtx.items() if count >= threshold]

# 사용 예시
posts = [
    "I love coding and programming.",
    "Coding is my passion.",
    "Programming requires patience.",
    "I enjoy programming challenges.",
]

mtx = gen_word_mtx(posts)
threshold = 2
frequent_pairs = word_pairs(mtx, threshold)

print("Frequent word pairs:", frequent_pairs)

5. __str____repr__ 메서드의 목적은 무엇인가요?

  • 답변:
    • __str__: 객체를 사람이 읽기 쉬운 형식으로 나타냄.
    • __repr__: 객체를 디버깅용 형식으로 나타냄.
class MyClass:
    def __str__(self):
        return "This is a MyClass object"

    def __repr__(self):
        return "MyClass()"

obj = MyClass()
print(obj)  # "This is a MyClass object"
print(repr(obj))  # "MyClass()"

6. Facebook 게시글에서 중복된 해시태그를 제거하는 함수를 작성하세요.

  • 답변:중복 해시태그를 제거하고 게시글을 반환하는 함수입니다.
def rem_dup_hashtags(post):
    words = post.split()
    uniq_words = []

    for word in words:
        if word.startswith('#') and word not in uniq_words:
            uniq_words.append(word)
        elif not word.startswith('#'):
            uniq_words.append(word)

    return ' '.join(uniq_words)

# 사용 예시
user_post = "Enjoying a great day with #friends! #Friends forever. #Fun times ahead! #Friends"
cleaned_post = rem_dup_hashtags(user_post)
print("Cleaned post:", cleaned_post)

7. Facebook 커뮤니티에서 게시글 참여도를 기준으로 상위 N명의 인플루언서를 찾는 알고리즘을 작성하세요.

  • 답변:게시글 참여도 데이터를 기반으로 인플루언서를 계산하는 알고리즘입니다.
def top_n_influencers(posts, n):
    metrics = {}

    for post in posts:
        metric = post['engage']
        author = post['author']
        metrics[author] = metrics.get(author, 0) + metric

    top_influencers = sorted(metrics.items(), key=lambda x: x[1], reverse=True)
    return top_influencers[:n]

# 사용 예시
posts = [
    {'author': 'Inf1', 'engage': 150},
    {'author': 'Inf2', 'engage': 120},
    {'author': 'Inf1', 'engage': 80},
]

top_influencers = top_n_influencers(posts, 2)
print("Top Influencers:", top_influencers)

8. 파이썬의 @property 데코레이터는 무엇인가요?

  • 답변:@property 데코레이터는 메서드를 읽기 전용 속성으로 바꿔줍니다.
python
코드 복사
class MyClass:
    def __init__(self):
        self._value = 42

    @property
    def value(self):
        return self._value

obj = MyClass()
print(obj.value)  # 42 출력

9. 서로 다른 데이터 타입을 문자열로 결합하는 방법은 무엇인가요?

  • 답변 :f-string 또는 문자열 포매팅을 사용합니다.
name = "Ramashish"
age = 25
message = f"My name is {name} and I am {age} years old."
print(message)

10. Facebook 게시글의 단어를 반대로 뒤집으면서 문장 부호는 유지하는 함수를 작성하세요.

  • 답변:아래 함수는 단어를 뒤집되, 알파벳 외의 문장 부호는 유지합니다.
def rev(post):
    words = post.split()
    rev_words = [w[::-1] if w.isalpha() else w for w in words]
    return ' '.join(rev_words)

# 사용 예시
post1 = "Hello, world! Coding is fun."
reversed_post = rev(post1)
print("Reversed post:", reversed_post)

Apple Python 프로그래밍 인터뷰 질문


1. 파이썬 딕셔너리에서 키가 존재하는지 확인하는 방법과 존재하지 않는 키에 접근하면 어떤 일이 발생하나요?

  • 답변:in 키워드를 사용하여 키가 존재하는지 확인할 수 있습니다.존재하지 않는 키에 접근하면 KeyError가 발생합니다.
my_dict = {'name': 'Siteshwar', 'age': 25}

# 키 존재 여부 확인
if 'name' in my_dict:
    print(my_dict['name'])  # "Siteshwar"

# 존재하지 않는 키에 접근
try:
    print(my_dict['city'])
except KeyError:
    print("Key not found.")  # "Key not found."

2. 파이썬의 __name__ 변수의 목적은 무엇인가요?

  • 답변:__name__ 변수는 스크립트가 직접 실행 중인지, 아니면 모듈로 임포트되었는지를 판별하는 데 사용됩니다.
if __name__ == "__main__":
    print("This script is being run as the main program.")

3. Pandas 데이터프레임에서 'Score' 열이 80보다 큰 행을 필터링하는 방법은 무엇인가요?

  • 답변:부울 인덱싱(Boolean Indexing)을 사용합니다.
df_filtered = df[df['Score'] > 80]

4. iMessages에서 가장 많이 사용된 이모지를 찾는 Python 함수를 작성하세요.

  • 답변:emoji 라이브러리와 collections.Counter를 사용하여 이모지를 추출하고 빈도를 계산합니다.
mport emoji
from collections import Counter

def most_frequent_emojis(imessages):
    emojis = [c for m in imessages for c in m if c in emoji.UNICODE_EMOJI['en']]
    emoji_counts = Counter(emojis)
    return emoji_counts.most_common()

# 사용 예시
imessages = [
    "Hey! 😊 How are you today? 😊",
    "I'm doing well, thanks! 😊",
    "Let's catch up later. 😊",
    "Sure! 😊",
]

most_freq = most_frequent_emojis(imessages)
print("Most frequently used emojis:")
for emo, count in most_freq:
    print(f"{emo}: {count} times")

5. iPhone 사진을 카테고리(사람, 풍경, 동물, 음식 등)별로 분류하는 Python 함수를 작성하세요.

  • 답변:PyTorch와 사전 학습된 모델(ResNet-18)을 사용하여 이미지를 분류합니다.
import torch
from torchvision import models, transforms as T
from PIL import Image

def cat_photos(photo_paths):
    model = models.resnet18(pretrained=True).eval()
    transform = T.Compose([T.Resize((224, 224)), T.ToTensor(),
                           T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])])
    cat = {}

    for path in photo_paths:
        img = Image.open(path).convert('RGB')
        input_tensor = transform(img)
        output = model(input_tensor.unsqueeze(0))

        with open("imagenet_classes.txt", "r") as file:
            labels = [line.strip() for line in file.readlines()]

        _, idx = torch.max(output, 1)
        label = labels[idx.item()]
        cat.setdefault(label, []).append(path)

    return cat

# 사용 예시
photos = ["path/to/photo1.jpg", "path/to/photo2.jpg", "path/to/photo3.jpg"]
result = cat_photos(photos)

for category, paths in result.items():
    print(f"{category.capitalize()}: {len(paths)} photos")

6. Facebook 게시글에서 공통 단어를 제외한 고유 단어의 빈도를 계산하는 함수를 작성하세요.

  • 답변:nltk 라이브러리를 사용하여 불용어(stop words)를 제외하고 단어 빈도를 계산합니다.
import nltk
from nltk.corpus import stopwords
from collections import Counter

nltk.download('stopwords')

def get_freq_of_words(post):
    words = nltk.word_tokenize(post.lower())
    stop_words = set(stopwords.words('english'))
    words = [word for word in words if word.isalnum() and word not in stop_words]
    word_freq = Counter(words)
    return dict(word_freq)

# 사용 예시
fb_post = "Hello world! How's your Python coding going on. #Startlearn #Ready"
result = get_freq_of_words(fb_post)

print("Word Frequency:")
for word, freq in result.items():
    print(f"{word}: {freq} times")

7. 딕셔너리에서 Pandas 데이터프레임을 생성하는 방법은 무엇인가요?

  • 답변:pd.DataFrame() 생성자를 사용하여 딕셔너리를 데이터프레임으로 변환할 수 있습니다.
import pandas as pd

data = {'Name': ['Alice', 'Bob', 'Charlie'], 'Age': [25, 30, 22]}
df = pd.DataFrame(data)
print(df)

8. Pandas 데이터프레임에서 특정 열을 기준으로 데이터를 그룹화하는 방법은 무엇인가요?

  • 답변:groupby() 메서드를 사용합니다.
grouped_data = df.groupby('Category')

9. NumPy에서 np.mean()np.average()의 차이점은 무엇인가요?

  • 답변:
    • np.mean(): 산술 평균을 계산합니다.
    • np.average(): 가중치를 지정하여 평균을 계산할 수 있습니다.
import numpy as np

arr = np.array([0.1, 0.2, 0.3, 0.4, 0.5])

mean_result = np.mean(arr)
weights = np.array([0.1, 0.2, 0.3, 0.2, 0.2])
wavg_result = np.average(arr, weights=weights)

print(f"Arithmetic Mean: {mean_result}")
print(f"Weighted Average: {wavg_result}")

10. 파이썬에서 리스트의 중복 요소를 제거하는 방법은 무엇인가요?

  • 답변:set()을 사용하여 중복을 제거한 뒤 리스트로 변환합니다.
main_list = [1, 2, 2, 3, 4, 4, 5]
unique_list = list(set(main_list))
print(unique_list)  # [1, 2, 3, 4, 5]
profile
Tistory로 이사갔어요

0개의 댓글