본문 바로가기

PYTHON

[TIL] 20240227 11일차

이번주 목(2024-02-29) 까지 진행할 개인 과제 중
3번 문항을 풀이 중인 코드를 리뷰하고자 한다.
회원 가입 및 포스팅(글쓰기) 기능 구현이다.

 

https://creative-darkstar.tistory.com/13

 

[TIL] 20240226 10일차

다음주 목(2024-02-29) 까지 진행할 개인 과제 중 3번 문항을 풀이 중인 코드를 리뷰하고자 한다. 회원 가입 및 포스팅(글쓰기) 기능 구현이다. class Member(): def __init__(self, name, username, password): self.name

creative-darkstar.tistory.com

 

어제 진행한 것에 이어서 진행했고

회원 가입 기능에 이어서 4개의 기능을 추가했다.

 

회원 가입 기능을 함수로 따로 정의했고

4개의 기능 또한 함수로 정의했다.

 

메인 함수에서는 각 기능들을 선택할 수 있도록 했다.

 

 

class Member():
    def __init__(self, name, username, password):
        self.name = name
        self.username = username
        self.password = password
    
    def display(self):
        # 회원명, ID를 출력할 때 첫 글자 제외 *로 표시하여 정보를 보호한다.
        show_name = self.name[0] + len(self.name[1:]) * '*'
        show_username = self.username[0] + len(self.username[1:]) * '*'
        print(f" 회원명: {show_name}, ID: {show_username}")
        

class Post(Member):
    def __init__(self, title, content, name, username, password):
        self.title = title
        self.content = content
        super().__init__(name, username, password)
        self.author = self.username

 

클래스 Member, Post 정의

 

 

# 메인 함수
def main():
    print("┌───────────Spartans' Blog───────────┐")
    print("│ 글을 작성하고 회원들과 공유하세요. │")
    print("└────────────────────────────────────┘\n")
    
    while True:
        main_command = input("원하는 작업을 선택하세요.\n\n1. 회원가입\n2. 로그인\n3. 글 작성\n4. 글 검색\n5. 전체 회원 조회\n\n종료를 원하면 x나 q를 입력하십시오.\n\n입력: ").lower()
        if main_command == '1':
            # 회원가입
            sign_up()
        elif main_command == '2':
            # 로그인
            log_in()
        elif main_command == '3':
            # 글 작성
            post()
        elif main_command == '4':
            # 글 검색
            search()
        elif main_command == '5':
            # 전체 회원 조회
            show_members()
        elif main_command == 'x' or main_command == 'q':
            print("\n프로그램을 종료합니다.")
            break
        else:
            print("\n유효하지 않은 입력입니다. 다시 시도하십시오.\n")
            continue

 

메인 함수

 

 

# 회원가입 함수
def sign_up():
    print("\n'1. 회원가입'을 선택하셨습니다.\n")
    
    # 회원가입 시도 횟수
    try_num = 0
    
    # 회원가입 시작
    while (try_num < MAX_SIGNUP_TIME):
        print("[회원가입]\n회원 정보를 입력합니다...\n")
        
        # 회원가입에 필요한 정보 입력
        add_name = input("이름을 입력하십시오.: ")
        add_username = input("ID를 입력하십시오.: ")
        add_password = input("PW를 입력하십시오.: ")
        
        # 회원가입 진행 여부 확인
        # True: 회원가입 진행 / False: 회원가입 취소
        if input(f"\n입력하신 정보는 아래와 같습니다.\n이름: {add_name}\nID: {add_username}\nPW: {add_password}\n\n맞다면 'y'를 입력하십시오.\n취소하고 싶다면 그 외의 입력을 해주십시오.\n입력: ").lower() == 'y':
            print("\n회원가입을 진행합니다...")
            members.append(Member(add_name, add_username, add_password))
            print("완료\n")
        else:
            print("\n작성하신 정보로 가입 진행을 취소하셨습니다.\n")
        
        # 회원가입 시도 횟수 +1
        try_num += 1
        
        # 회원가입 중지 여부 결정
        if input("회원가입을 그만하고 싶으면 'y'를 입력하십시오.\n계속하고 싶다면 그 외의 입력을 해주십시오.\n입력: ").lower() == 'y':
            print("\n회원가입을 종료합니다. 메인 화면으로 이동합니다.\n")
            break
    
    print(".........................................")

 

회원가입 함수 sign_up()

 

 

# 로그인 함수
def log_in():
    print("\n'2. 로그인'을 선택하셨습니다.\n")
    global login_info
    
    # 이미 로그인을 한 경우 계정을 변경할지 변경하지 않고 로그인을 종료할지 선택
    if login_info:
        if input("이미 로그인한 상태입니다. 다른 계정으로 로그인 하시겠습니까?\n맞다면 'y'를 입력하십시오. 기존의 계정은 로그아웃합니다.\n아니라면 그 외의 입력을 해주십시오. 메인 화면으로 이동합니다.\n\n입력: ").lower() == 'y':
            print("\n기존 계정은 로그아웃하고 다른 계정으로 로그인을 시도합니다.\n")
            login_info = list()
        else:
            print("\n기존 계정으로 진행합니다. 메인 화면으로 이동합니다.\n")
            print(".........................................")
    
    # 로그인 시도 횟수
    try_num = 0
    
    # 로그인 시작
    while (try_num < MAX_LOGIN_TIME):
        print("[로그인]\n가입한 회원 정보로 로그인을 시도합니다...\n")
        
        # 로그인에 필요한 정보 입력
        check_username = input("ID를 입력하십시오.: ")
        check_password = input("PW를 입력하십시오.: ")
        
        # 로그인 진행
        for member in members:
            if check_username == member.username and check_password == member.password:
                login_info = [member.name, member.username, member.password]
                print("\n로그인 하였습니다. 글 작성을 하실 수 있습니다.\n")
                break
        
        # 로그인 실패 시
        if not login_info:
            print("\n닉네임이 존재하지 않거나 잘못된 비밀번호입니다. 다시 시도하십시오.\n")
            
            # 로그인 중지 여부 결정
            if input("로그인을 그만하고 싶으면 'y'를 입력하십시오.\n계속하고 싶다면 그 외의 입력을 해주십시오.\n입력: ").lower() == 'y':
                print("로그인을 종료합니다.\n")
                break
        
        # 로그인 시도 횟수 +1
        try_num += 1

    print(".........................................")

 

로그인 함수 log_in()

 

 

# 글 작성 함수
def post():
    print("\n'3. 글 작성'을 선택하셨습니다.\n")
    global login_info
    
    # 로그인을 하지 않은 경우 경고 메시지를 출력하고 글 쓰기 종료
    if not login_info:
        print("로그인 하지 않아 글 작성을 할 수 없습니다. 먼저 로그인 해주십시오.\n메인 화면으로 이동합니다.\n")
        print(".........................................")
        return
    
    # 글 작성 시도 횟수
    try_num = 0
    
    # 글 작성 시작
    while (try_num < MAX_POST_TIME):
        print("[글 쓰기]\n글을 작성합니다...\n")
        
        # 글 작성에 필요한 정보 입력
        title = input("작성하실 글 제목을 입력하십시오: ")
        content = input("작성하실 글 내용을 입력하십시오: ")
        
        # 글 작성 진행 여부 확인
        # True: 글 작성 진행 / False: 글 작성 취소
        if input(f"\n입력하신 정보는 아래와 같습니다.\n제목: {title}\n내용: {content}\n\n맞다면 'y'를 입력하십시오.\n취소하고 싶다면 그 외의 입력을 해주십시오.\n입력: ").lower() == 'y':
            print("\n작성하신 글을 등록합니다...")
            # login_info[0]: member.name
            # login_info[1]: member.username
            # login_info[2]: member.password
            posts.append(Post(title, content, login_info[0], login_info[1], login_info[2]))
            print("완료\n")
        else:
            print("\n글 작성을 취소하셨습니다.\n")
        
        # 글 작성 시도 횟수 +1
        try_num += 1
        
        # 글 작성 중지 여부 결정
        if input("글 작성을 그만하고 싶으면 'y'를 입력하십시오.\n계속하고 싶다면 그 외의 입력을 해주십시오.\n입력: ").lower() == 'y':
            print("\n글 작성을 종료합니다. 메인 화면으로 이동합니다.\n")
            break
    
    print(".........................................")

 

글 작성 함수 post()

 

 

# 글 검색 함수
def search():
    print("\n'4. 글 검색'을 선택하셨습니다.\n")
    
    # 글 검색 시도 횟수
    try_num = 0
    # 검색 결과 갯수
    results = 0
    
    # 검색 시작
    while (try_num < MAX_SEARCH_TIME):
        print("[글 검색]\n특정 조건에 맞는 글을 검색합니다....\n")
        
        # 검색 옵션 선택
        search_opt = input("검색 옵션을 선택하십시오.\n\n1. 내용에 해당 단어가 포함\n2. 제목에 해당 단어가 포함\n3. 내용 또는 제목에 해당 단어가 포함\n4. 해당 닉네임으로 작성함\n\n입력: ").lower()
        if search_opt not in ['1', '2', '3', '4']:
            print("\n유효하지 않은 검색 옵션입니다. 다시 시도하십시오.\n")
            continue
        
        # 검색 키워드 입력
        search_word = input("검색할 키워드를 입력하십시오.: ")
        
        # 옵션, 키워드에 맞는 검색 진행
        for post in posts:
            # 1. 내용에 해당 단어가 포함
            if search_opt == '1':
                if search_word in post.content:
                    print(f"\n'{search_word}' 키워드가 내용에 포함된 글 제목은 '{post.title}' 입니다.")
                    results += 1
            # 2. 제목에 해당 단어가 포함
            elif search_opt == '2':
                if search_word in post.title:
                    print(f"\n'{search_word}' 키워드가 제목에 포함된 글 제목은 '{post.title}' 입니다.")
                    results += 1
            # 3. 내용 또는 제목에 해당 단어가 포함
            elif search_opt == '3':
                if (search_word in post.content) or (search_word in post.title):
                    print(f"\n'{search_word}' 키워드가 내용 또는 제목에 포함된 글 제목은 '{post.title}' 입니다.")
                    results += 1
            # 4. 해당 닉네임으로 작성함
            elif search_opt == '4':
                if search_word == post.author:
                    print(f"\n{search_word} 님이 작성하신 글 제목은 '{post.title}' 입니다.")
                    results += 1
        
        # 검색 결과 갯수 출력
        if not results:
            print("\n검색 조건에 맞는 글이 존재하지 않습니다.\n")
        else:
            print(f"\n검색 결과 총 {results}개의 글을 찾았습니다.\n")
        
        # 검색 시도 횟수 +1
        try_num += 1
        
        # 검색 중지 여부 결정
        if input("검색을 그만하고 싶으면 'y'를 입력하십시오.\n계속하고 싶다면 그 외의 입력을 해주십시오.\n입력: ").lower() == 'y':
            print("검색을 종료합니다.\n")
            break
    
    print(".........................................")

 

글 검색 함수 search()

 

 

# 전체 회원 조회 함수
def show_members():
    print("\n'5. 전체 회원 조회'를 선택하셨습니다.\n")
    
    # 전체 회원 조회 시작
    print("┌───────────[현재 모든 회원 목록]───────────┐")
    
    # 회원이 존재하지 않으면 대체 텍스트 출력
    # 회원이 존재할 경우 전체 회원 출력
    if not members:
        print("\t  회원이 존재하지 않습니다.")
    else:
        for member in members:
            member.display()
    print("└───────────────────────────────────────────┘\n")

 

전체 회원 조회 함수 show_members()

 

 

더보기
MAX_SIGNUP_TIME = 10
MAX_LOGIN_TIME = 5
MAX_SEARCH_TIME = 5
MAX_POST_TIME = 50

class Member():
    def __init__(self, name, username, password):
        self.name = name
        self.username = username
        self.password = password
    
    def display(self):
        # 회원명, ID를 출력할 때 첫 글자 제외 *로 표시하여 정보를 보호한다.
        show_name = self.name[0] + len(self.name[1:]) * '*'
        show_username = self.username[0] + len(self.username[1:]) * '*'
        print(f" 회원명: {show_name}, ID: {show_username}")
        

class Post(Member):
    def __init__(self, title, content, name, username, password):
        self.title = title
        self.content = content
        super().__init__(name, username, password)
        self.author = self.username


# 회원가입 함수
def sign_up():
    print("\n'1. 회원가입'을 선택하셨습니다.\n")
    
    # 회원가입 시도 횟수
    try_num = 0
    
    # 회원가입 시작
    while (try_num < MAX_SIGNUP_TIME):
        print("[회원가입]\n회원 정보를 입력합니다...\n")
        
        # 회원가입에 필요한 정보 입력
        add_name = input("이름을 입력하십시오.: ")
        add_username = input("ID를 입력하십시오.: ")
        add_password = input("PW를 입력하십시오.: ")
        
        # 회원가입 진행 여부 확인
        # True: 회원가입 진행 / False: 회원가입 취소
        if input(f"\n입력하신 정보는 아래와 같습니다.\n이름: {add_name}\nID: {add_username}\nPW: {add_password}\n\n맞다면 'y'를 입력하십시오.\n취소하고 싶다면 그 외의 입력을 해주십시오.\n입력: ").lower() == 'y':
            print("\n회원가입을 진행합니다...")
            members.append(Member(add_name, add_username, add_password))
            print("완료\n")
        else:
            print("\n작성하신 정보로 가입 진행을 취소하셨습니다.\n")
        
        # 회원가입 시도 횟수 +1
        try_num += 1
        
        # 회원가입 중지 여부 결정
        if input("회원가입을 그만하고 싶으면 'y'를 입력하십시오.\n계속하고 싶다면 그 외의 입력을 해주십시오.\n입력: ").lower() == 'y':
            print("\n회원가입을 종료합니다. 메인 화면으로 이동합니다.\n")
            break
    
    print(".........................................")


# 로그인 함수
def log_in():
    print("\n'2. 로그인'을 선택하셨습니다.\n")
    global login_info
    
    # 이미 로그인을 한 경우 계정을 변경할지 변경하지 않고 로그인을 종료할지 선택
    if login_info:
        if input("이미 로그인한 상태입니다. 다른 계정으로 로그인 하시겠습니까?\n맞다면 'y'를 입력하십시오. 기존의 계정은 로그아웃합니다.\n아니라면 그 외의 입력을 해주십시오. 메인 화면으로 이동합니다.\n\n입력: ").lower() == 'y':
            print("\n기존 계정은 로그아웃하고 다른 계정으로 로그인을 시도합니다.\n")
            login_info = list()
        else:
            print("\n기존 계정으로 진행합니다. 메인 화면으로 이동합니다.\n")
            print(".........................................")
    
    # 로그인 시도 횟수
    try_num = 0
    
    # 로그인 시작
    while (try_num < MAX_LOGIN_TIME):
        print("[로그인]\n가입한 회원 정보로 로그인을 시도합니다...\n")
        
        # 로그인에 필요한 정보 입력
        check_username = input("ID를 입력하십시오.: ")
        check_password = input("PW를 입력하십시오.: ")
        
        # 로그인 진행
        for member in members:
            if check_username == member.username and check_password == member.password:
                login_info = [member.name, member.username, member.password]
                print("\n로그인 하였습니다. 글 작성을 하실 수 있습니다.\n")
                break
        
        # 로그인 실패 시
        if not login_info:
            print("\n닉네임이 존재하지 않거나 잘못된 비밀번호입니다. 다시 시도하십시오.\n")
            
            # 로그인 중지 여부 결정
            if input("로그인을 그만하고 싶으면 'y'를 입력하십시오.\n계속하고 싶다면 그 외의 입력을 해주십시오.\n입력: ").lower() == 'y':
                print("로그인을 종료합니다.\n")
                break
        
        # 로그인 시도 횟수 +1
        try_num += 1

    print(".........................................")


# 글 작성 함수
def post():
    print("\n'3. 글 작성'을 선택하셨습니다.\n")
    global login_info
    
    # 로그인을 하지 않은 경우 경고 메시지를 출력하고 글 쓰기 종료
    if not login_info:
        print("로그인 하지 않아 글 작성을 할 수 없습니다. 먼저 로그인 해주십시오.\n메인 화면으로 이동합니다.\n")
        print(".........................................")
        return
    
    # 글 작성 시도 횟수
    try_num = 0
    
    # 글 작성 시작
    while (try_num < MAX_POST_TIME):
        print("[글 쓰기]\n글을 작성합니다...\n")
        
        # 글 작성에 필요한 정보 입력
        title = input("작성하실 글 제목을 입력하십시오: ")
        content = input("작성하실 글 내용을 입력하십시오: ")
        
        # 글 작성 진행 여부 확인
        # True: 글 작성 진행 / False: 글 작성 취소
        if input(f"\n입력하신 정보는 아래와 같습니다.\n제목: {title}\n내용: {content}\n\n맞다면 'y'를 입력하십시오.\n취소하고 싶다면 그 외의 입력을 해주십시오.\n입력: ").lower() == 'y':
            print("\n작성하신 글을 등록합니다...")
            # login_info[0]: member.name
            # login_info[1]: member.username
            # login_info[2]: member.password
            posts.append(Post(title, content, login_info[0], login_info[1], login_info[2]))
            print("완료\n")
        else:
            print("\n글 작성을 취소하셨습니다.\n")
        
        # 글 작성 시도 횟수 +1
        try_num += 1
        
        # 글 작성 중지 여부 결정
        if input("글 작성을 그만하고 싶으면 'y'를 입력하십시오.\n계속하고 싶다면 그 외의 입력을 해주십시오.\n입력: ").lower() == 'y':
            print("\n글 작성을 종료합니다. 메인 화면으로 이동합니다.\n")
            break
    
    print(".........................................")


# 글 검색 함수
def search():
    print("\n'4. 글 검색'을 선택하셨습니다.\n")
    
    # 글 검색 시도 횟수
    try_num = 0
    # 검색 결과 갯수
    results = 0
    
    # 검색 시작
    while (try_num < MAX_SEARCH_TIME):
        print("[글 검색]\n특정 조건에 맞는 글을 검색합니다....\n")
        
        # 검색 옵션 선택
        search_opt = input("검색 옵션을 선택하십시오.\n\n1. 내용에 해당 단어가 포함\n2. 제목에 해당 단어가 포함\n3. 내용 또는 제목에 해당 단어가 포함\n4. 해당 닉네임으로 작성함\n\n입력: ").lower()
        if search_opt not in ['1', '2', '3', '4']:
            print("\n유효하지 않은 검색 옵션입니다. 다시 시도하십시오.\n")
            continue
        
        # 검색 키워드 입력
        search_word = input("검색할 키워드를 입력하십시오.: ")
        
        # 옵션, 키워드에 맞는 검색 진행
        for post in posts:
            # 1. 내용에 해당 단어가 포함
            if search_opt == '1':
                if search_word in post.content:
                    print(f"\n'{search_word}' 키워드가 내용에 포함된 글 제목은 '{post.title}' 입니다.")
                    results += 1
            # 2. 제목에 해당 단어가 포함
            elif search_opt == '2':
                if search_word in post.title:
                    print(f"\n'{search_word}' 키워드가 제목에 포함된 글 제목은 '{post.title}' 입니다.")
                    results += 1
            # 3. 내용 또는 제목에 해당 단어가 포함
            elif search_opt == '3':
                if (search_word in post.content) or (search_word in post.title):
                    print(f"\n'{search_word}' 키워드가 내용 또는 제목에 포함된 글 제목은 '{post.title}' 입니다.")
                    results += 1
            # 4. 해당 닉네임으로 작성함
            elif search_opt == '4':
                if search_word == post.author:
                    print(f"\n{search_word} 님이 작성하신 글 제목은 '{post.title}' 입니다.")
                    results += 1
        
        # 검색 결과 갯수 출력
        if not results:
            print("\n검색 조건에 맞는 글이 존재하지 않습니다.\n")
        else:
            print(f"\n검색 결과 총 {results}개의 글을 찾았습니다.\n")
        
        # 검색 시도 횟수 +1
        try_num += 1
        
        # 검색 중지 여부 결정
        if input("검색을 그만하고 싶으면 'y'를 입력하십시오.\n계속하고 싶다면 그 외의 입력을 해주십시오.\n입력: ").lower() == 'y':
            print("검색을 종료합니다.\n")
            break
    
    print(".........................................")


# 전체 회원 조회 함수
def show_members():
    print("\n'5. 전체 회원 조회'를 선택하셨습니다.\n")
    
    # 전체 회원 조회 시작
    print("┌───────────[현재 모든 회원 목록]───────────┐")
    
    # 회원이 존재하지 않으면 대체 텍스트 출력
    # 회원이 존재할 경우 전체 회원 출력
    if not members:
        print("\t  회원이 존재하지 않습니다.")
    else:
        for member in members:
            member.display()
    print("└───────────────────────────────────────────┘\n")


# 메인 함수
def main():
    print("┌───────────Spartans' Blog───────────┐")
    print("│ 글을 작성하고 회원들과 공유하세요. │")
    print("└────────────────────────────────────┘\n")
    
    while True:
        main_command = input("원하는 작업을 선택하세요.\n\n1. 회원가입\n2. 로그인\n3. 글 작성\n4. 글 검색\n5. 전체 회원 조회\n\n종료를 원하면 x나 q를 입력하십시오.\n\n입력: ").lower()
        if main_command == '1':
            # 회원가입
            sign_up()
        elif main_command == '2':
            # 로그인
            log_in()
        elif main_command == '3':
            # 글 작성
            post()
        elif main_command == '4':
            # 글 검색
            search()
        elif main_command == '5':
            # 전체 회원 조회
            show_members()
        elif main_command == 'x' or main_command == 'q':
            print("\n프로그램을 종료합니다.")
            break
        else:
            print("\n유효하지 않은 입력입니다. 다시 시도하십시오.\n")
            continue


if __name__ == "__main__":
    # posts: Post 인스턴스들의 리스트
    # members: Member 인스턴스들의 리스트
    # login_info: 로그인 계정의 정보 (구성: [member.name, member.username, member.password])
    posts = list()
    members = list()
    login_info = list()
    main()

 

'PYTHON' 카테고리의 다른 글

[TIL] 20240229 13일차  (0) 2024.02.29
[TIL] 20240228 12일차  (0) 2024.02.28
[TIL] 20240226 10일차  (1) 2024.02.26
[TIL] 20240223 9일차  (0) 2024.02.23
[TIL] 20240222 8일차  (0) 2024.02.22