캠프

[기초 과제] Class로 회원/게시물 관리

kinggoddino 2024. 7. 8.

▶ 내용

  • Member 클래스와 Post 클래스 정의
  • Member 클래스의 속성 : 이름(name), 아이디(username), 비밀번호(password)
  • Member 클래스의 메소드 : 회원 정보를 print 해주는 display(회원이름과 아이디만 보여주고 비밀번호는 보여주면 안됨)
  • Post 클래스의 속성 : 제목(title), 내용(content), 작성자(author : 회원의 username 이 저장되어야 함)
  • 회원 인스턴스를 세개 이상 만들고 members 라는 빈 리스트에 append를 써서 저장, members 리스트를 돌면서 회원들의 이름을 모두 프린트
  • 각각의 회원이 게시글을 세개 이상 작성하고, 게시글은 posts 빈 리스트에 append를 써서 저장
  • for문을 돌면서 특정 유저가 작성한 게시글의 제목을 모두 프린트, 특정 단어가 content 에 포함된 게시글의 제목을 모두 프린트

▶ 추가 도전 과제

  • input을 이용하여 Member 인스턴스 만드는 것을 사용자가 터미널에서 할 수 있게 하기
  • posts 도 터미널에서 생성할 수 있게 하기
  • hashlib 라이브러리를 써서 회원 비밀번호를 해시화하여 저장하기

 코드

import hashlib # 비밀번호 해시화를 위한 hashlib 모듈 import

class Member: # Member 클래스 만들기
    def __init__(self, name, username, password): # 초기화 함수
        self.name = name # 이름 초기화
        self.username = username # 아이디 초기화
        self.password = hashlib.sha256(password.encode()).hexdigest() # 비밀번호 해시화해서 저장

    def display(self): # display 메서드 선언
        print(f"Name : {self.name}, ID : {self.username}") # 이름, ID 출력(비밀번호는 출력 안함)

class Post: # Post 클래스 만들기
    def __init__(self, title, content, author): # 초기화 함수
        self.title = title # 제목 초기화
        self.content = content # 내용 초기화
        self.author = author # 작성자 초기화

클래스 Member, Post 만들기

members = [] # 변수선언, members 초기값 = 빈리스트
posts = [] # 변수선언, posts 초기값 = 빈리스트

# member 인스턴스 생성해서 members 리스트에 추가
members.append(Member("Spino", "cuty", "password1"))
members.append(Member("Tyranno", "king", "password2"))
members.append(Member("Stego", "babo", "password3"))

# post 인스턴스 생성해서 posts 리스트에 추가
posts.append(Post("배고파", "저녁뭐먹지", "cuty"))
posts.append(Post("연어", "연어먹고싶어", "cuty"))
posts.append(Post("왕", "내가왕이다", "king"))
posts.append(Post("심심해", "심심하다", "babo"))
posts.append(Post("뭐하지", "심심하네", "babo"))

각 클래스의 예시 인스턴스들을 만들고 members, posts 리스트에 추가하기

def create_member(): # 회원 생성 함수 선언
    name = input("이름을 입력해주세요 : ") # 이름 입력받기
    username = input("ID를 입력해주세요 : ") # ID 입력받기
    password = input("비밀번호를 입력해주세요 : ") # 비밀번호 입력받기
    new_member = Member(name, username, password) # 새로운회원 인스턴스 생성하고
    members.append(new_member) # members 리스트에 추가하기
    print(f'<{username}>님 회원가입을 환영합니다!!') # 환영 메시지 출력

print("\n<<< 회원 등록하기 >>>") # 회원등록하기
create_member() # 회원 생성 함수 호출

새로운 회원 등록하기 함수

실행결과

def create_post(): # 게시글 생성 함수 선언
    author = input("ID를 입력해주세요 : ") # ID 입력받기
    title = input("제목을 입력해주세요 : ") # 제목 입력받기
    content = input("내용을 입력해주세요 : ") # 내용 입력받기
    new_post = Post(title, content, author) # 새로운게시물 인스턴스 생성하고
    posts.append(new_post) # posts 리스트에 추가하기
    print(f'<{author}>님의 게시글이 등록되었습니다!!') # 등록 메시지 출력

print("\n<<< 게시글 등록하기 >>>") # 게시글등록하기
create_post() # 게시글 생성 함수 호출

이번에는 새로운 게시물 등록하기 함수

실행결과

while True: # 무한루프 반복
    another_member = input("\n새로운 회원 추가하실래요? (y/n): ").lower() 
    # 회원 추가 여부 입력받기, 소문자로 변환해서 another_member에 저장
    
    if another_member == 'n': # n 라고 입력한 경우
        break # 무한루프 탈출하기
    
    elif another_member =='y': # y 라고 입력한 경우
        print("\n<<< 새로운 회원 등록하기 >>>") # 새로운 회원 등록
        create_member() # 회원 생성 함수 호출

    else: # n,y 말고 다른거 입력했을 경우
        print("잘못된 입력값입니다. 다시 입력해주세요. (y/n)") # 유효한 입력 유도하기

새로운 회원을 추가할건지 물어보기

(이거 만든이유는 데이터 많이 쌓고싶은데 회원생성과 게시글 생성이 각각 1회씩 하고 끝나버리게 돼서, 추가 생성을 원한다면 선택할 수 있게 만들었음. 회원생성만 만들었는데 게시글도 동일하게 만들 수 있다.)

y, n 입력했을 때 실행결과

print("\n<<< 등록된 회원들 모두 보여주기 >>>") # 모든 회원 출력
for member in members: # members 리스트를 돌면서
    member.display() # 하나씩 display 함수 호출

등록된 회원들 다 보여주기. 위의 회원추가에서 n 을 입력하면 바로 이어서 출력된다.

원래 있던 회원들 + 방금 내가 추가한 회원들까지 모두 출력됨.

while True: # 무한루프 반복
    author_searching = input("\n작성자로 검색하시겠습니까? (y/n) : ")
    # 작성자로 검색할건지 여부 입력받기
    
    if author_searching.lower() == 'y' : # y 입력한 경우
        author_search = input("검색할 작성자의 ID : ") # ID 입력받기
        print(f"<{author_search}>님이 작성한 게시글은 다음과 같습니다 : ") # 문구출력
        count_author = 0 # count_author 변수 선언, 초기값 = 0
        
        for post in posts: # posts 리스트 돌면서
            if post.author == author_search: # 작성자가 입력 ID랑 같을 경우
                print(f"{post.title}") # 해당 게시물 제목 출력
                count_author += 1 # count_author 변수에 1 더해줌
        
        if count_author == 0: # 리스트 다 돌아도 if를 만족 못하면 count값은 그대로 0
            print("해당 작성자의 게시물이 없습니다.") # 해당 작성자가 없다는 뜻
    
    elif author_searching.lower() == 'n' : # n 입력받았을 경우
        print("\n----------게시글 검색 종료----------") # 검색 종료 출력
        break # 무한루프 빠져나오기
    
    else: # n, y 말고 다른거 입력한 경우
        print("y(yes) 또는 n(no) 을 입력해주세요.") # 유효한 입력 유도하기

작성자 ID 를 입력하면 해당 게시글 제목을 출력해준다.

그리고 무한루프로 더는 검색하고 싶지 않을때까지 물어봐준다.

cuty 작성자가 작성한 게시글 제목이 모두 출력된다.

원래 등록되어 있던 <배고파>, <연어> + 방금 추가로 등록한 <초밥>

while True: # 무한루프 반복
    keyword_searching = input("\n키워드로 검색하시겠습니까? (y/n) : ")
    # 해당 키워드로 검색 여부 입력받기
    
    if keyword_searching.lower() == 'y' : # y 입력했을 경우
        keyword_search = input("내용 키워드를 입력해주세요 : ") # 검색할 키워드 입력받기
        print(f"<{keyword_search}>가 내용에 포함된 게시글은 다음과 같습니다 : ") # 문구출력
        count_keyword = 0 # count_keyword 변수 선언, 초기값 = 0
        
        for post in posts: # posts 리스트 돌면서
            if keyword_search in post.content: # 키워드가 게시물 내용에 있을 경우
                count_keyword += 1 # count_keyword 변수에 1 더해줌 
                print(f"{post.title}") # 해당 게시물 제목 출력
        
        if count_keyword == 0: # 리스트 다 돌아도 if를 만족 못하면 count값은 그대로 0
            print("키워드에 해당하는 검색결과가 없습니다.") # 해당 키워드가 없다는 뜻
    
    elif keyword_searching.lower() == 'n' : # n을 입력한 경우
        print("\n----------게시글 검색 종료----------") # 종료문구
        break # 무한루프 탈출
    
    else: # y, n 말고 다른거 입력한 경우
        print("y(yes) 또는 n(no) 을 입력해주세요.") # 유효한 입력 유도하기

print("\n검색을 종료합니다.") # 끝!

키워드를 입력하면 해당 내용의 게시글 제목을 출력해준다.

마찬가지로 더는 검색하고 싶지 않을때까지 물어봐준다.

'심심' 이라는 키워드가 포함된 게시글이 모두 출력된다.

총 2개 있고 게시글 제목은 <심심해>, <뭐하지>

 

y, n 말고 딴거 입력하면 다시 입력하라고 한다.

 

n 누르면 자동으로 검색 종료 문구 출력되고

 

끝!

 

 

 


 

'캠프' 카테고리의 다른 글

WIL  (0) 2024.08.03
WIL  (0) 2024.07.27
협업을 잘하려면  (0) 2024.07.05
개발역량 기르는법  (0) 2024.07.05
[기초 과제] 가위바위보 게임  (1) 2024.07.03