Share
Sign In
TIL 웹개발 - while 반복문 break, continue 사용하기
서경태
개인 과제로 주어진 두 문제
1.
Up&Down 게임 만들기
2.
가위, 바위, 보 게임 만들기
이 두 과제를 하는데 하루를 다 써버렸다...
🫠
핵심은 while 반복문 사용하기
사용법은 간단하지만 여러 조건들이 붙으며 구조를 잡는데 꽤나 애를 먹었다.
가장 어려웠던 부분은 게임을 한 차례 진행 후 새로 시작하는 것과 그 기록을 남기는 것.
1.
Up & Down 게임
Up&Down 게임 완성된 코드
우선 게임 내용은 쉽게 만들었다.
하지만
문제
1.
랜덤으로 나온 숫자가 코드를 실행할때마다 새롭게 생성이 되어 게임 진행이 안됨
2.
게임을 마치고 다시 시작하는지 혹은 마치는지 + 기록 표시
1번의 문제는 구글링 하다보니 구조적으로 해결이 되었다.
x는 컴퓨터가 만든 랜덤 숫자이고 n은 사용자가 입력한 숫자이다.
(사실 input을 쓰면 터미널에서 진행할 수 있는지 모르고 처음엔 VS code에서 index.html을 만들었다... request함수 쓰려고...)
x가 생성되고 n을 입력하며 힌트를 얻어 맞추면 끝나는데 n을 입력할때마다 x의 값도 바뀌니 게임 진행이 안되었다. 확률을 줄여나가는 게임인데 계속 1/100 확률 게임을 만들어 버린 것.
해결 방법은 x는 외부 while 반복문에 넣고 n은 내부 while 반복문에 위치해서 n = x 조건이 성립 될때까지 n의 변수를 입력하는 것이었다.
그리고 게임이 끝나면 다시 시작할지 그대로 종료할지 되묻는데 이때는 break와 exit()를 사용했다.
🖥️
while 반복문에서 break, continue 그리고 빈칸
break는 while 반복문이 조건을 성립하면 멈춘다. 위 코드의 경우 게임 재시작 의사를 물을 때 y를 누르면 내부 while 반복문이 종료되고 다시 외부 while 반복문이 시작되며 랜덤 숫자가 주어지고 게임이 진행된다.
continue는 break과 달리 while 반복문 조건이 성립되면 건너뛰고 이어뛰는 함수다. (예외 처리에 사용 가능할지도?)
빈칸은 조건 성립이 안되었기에 처음부터 다시 도는 것이다. y or n을 고르는 단계에서 a,e,d같은 문자열이 입력될 경우 print("다시 입력해주세요.")라고 하면 y or n 선택 단계로 돌아간다.
n을 누르면 프로그램을 종료하는데 나는 exit()를 사용했다. 구글링하다 본거 넣었나보다.
사실 exit()는 강제 종료라서 좋은 코드는 아닐거라고 생각한다. (일단 돌아가니 놔뒀다...)
🖥️
list로 시도 횟수 구하기
'기록'이라는 키워드 때문에 나는 list로 시도 횟수를 구했다. (아마 a +=1를 사용하면 더 간단했을지도...)
빈 리스트를 하나 만들고 n이 입력될 때마다 리스트를 하나씩 추가 시켰다. 그리고 마지막에 len(a_list)로 총 횟수를 구했다.
2.
가위바위보 게임
가위바위보 게임 완성된 코드
2번 문제의 내용은 1번과 상당 부분 비슷하지만 조건이 조금 더 까다로웠다.
1.
가위바위보로 승부를 내야하고 매번 게임을 새로 시작한다.
2.
게임의 기록을 마지막에 [승: 패: 무: ]로 표시한다.
우선, 외부 while 반복문에서 3개의 옵션을 리스트로 만들고 유저가 사용하는 것과 컴퓨터가 랜덤 추출하는 코드를 작성했다. 그리고 경우의 수(승패무)를 if 조건문으로 만든 후 게임이 끝나면 다시 내부 while 반복문으로 게임 재도전 의사를를 묻는 단계를 만들었다.
구조적으로 변수가 어디에 위치하느냐에 따라 실행되는 게 달라져서 몇 번의 시행착오가 있었다.
특히 이번에는 게임 기록이 제대로 작동되지 않았다. 1번 문제처럼 리스트를 만들고 시도했는데 잘 되지 않았다.
그냥 포기하고 a =+1로 잘되더라... (진작 할 걸) 하지만 이것도 변수가 while문 밖에 위치해야 기록이 초기화 되지 않았다.
break 때문에 그런 것 같다.
앞서 이야기한 것처럼, break은 반복을 종료한다. 그리고 상위 반복문을 다시 돌게 하는데 이때 변수가 같은 구조에 있으면 이것도 초기화 된다. 그래서 꼭! 변수의 위치를 신경써야 하는 것 같다.
/kyugntae-ai
Subscribe
Other posts in 'TIL 웹개발'See all
TIL 웹개발 - 두 class로 생성한 instance 연결, 공유하는 법
과제 내용을 보면 두 개의 class를 사용한다. 계정을 생성하는 Member 클래스 포스트를 생성하는 Post 클래스 각 클래스로 생성한 인스턴스를 리스트로 만들어 보여주는데 우리는 덧붙여 포스트를 삭제하는 기능을 넣었다. 그냥 __del__(소멸자: __init__과 반대)를 사용하면 되는거 되네 싶었는데, 실제 서비스에선 다른 사람이 내글을 마음대로 지운다면 진짜 개빡칠 것 아닌가? 그래서 아이디와 비밀번호를 기입해 포스트 삭제에 대한 권한을 부여한다. members = [m1, m2, m3] m1 = [name, username, password] Member 클래스로 만든 member 인스턴스와 인스턴스를 리스트로 만든 memebrs다. posts [p1, p2, p3] p1 = [title, content, author] Post 클래스로 만든 post 인스턴스와 인스턴스를 리스트로 만든 posts다. (단, author = username) 두 데이터를 연결시키는 방법은 post의 author 속성에 Member 클래스 인스턴스를 넣는 것이다. 그러면 아래 이미지처럼 사용할 수 있다. 그럼 p1 = [title, content, m1] 형태로 사용할수 있고 p1의 author를 알고 싶다면 p1.author.username을 사용하면된다. 그리고 만약 p1의 비밀번호를 알려면 p1.author.password를 사용하면 된다. elif select == '4': # 게시글 작성 while True: id_input = input("ID를 입력해주세요. ") member_matched = None for member in members: if id_input == member.username: member_matched = member break if member_matched: while True: ps_input = input("패스워드를 입력해주세요. ") if ps_input == member_matched.password: print("게시글을 작성해주세요.") title = input("\n제목: ") content = input("내용: ") posts.append(Post(title, content, member_matched)) print("\n게시글 작성을 완료했습니다.") break else: print("패스워드가 일치하지 않습니다.") break else: print("ID가 존재하지 않습니다. ") 위 코드에선 게시글을 작성할 때, 아이디와 비밀번호를 확인한다. 확인이 맞으면(memebr_matched) 제목과 내용을 기입하고 posts 리스트에 post 객체가 추가되는데 여기서 author에 member_matched를 사용한다. member_matched는 아이디와 비밀번호로 찾은 member 인스턴스이다. elif select == '5': # 게시글 삭제 del_title = input("삭제할 게시글의 제목을 입력하세요. ") post_matched = None for post in posts: if del_title == post.title: post_matched = post break if post_matched: while True: id_input = input("ID를 입력해주세요. ") if id_input == post_matched.author.username: while True: ps_input = input("패스워드를 입력해주세요. ") if ps_input == post_matched.author.password: posts.remove(post_matched) print(f'{post_matched.title}이 삭제되었습니다.') break else: print("패스워드가 일치하지 않습니다.") break else: print("아이디가 일치하지 않습니다.") 이렇게 게시글을 삭제할때, title을 검색해서 삭제할 post를 선택(post_matched라고 정의)하고 username과 password가 일치하면 삭제되는 기능이다. post_matched.author.username = member.username post_matched.author.password = member.password 기억하자. 두 클래스는 인스턴스를 공유할 수 있고 그 방법은 한 인스턴스를 다른 클래스의 속성으로 사용하면 된다.
서경태
TIL 웹개발 - Class 개념 정리
클래스(class) : 클래스는 객체를 생성하기 위한 청사진(설계도)입니다. 클래스는 데이터(어트리뷰트)와 행동(메서드)을 정의합니다. 객체(object) : 객체는 클래스의 인스턴스입니다. 클래스는 객체의 구조와 동작을 정의하고, 객체는 클래스에 정의된 구조와 동작을 실제로 구현한 것입니다. 인스턴스(instance) : 인스턴스는 클래스로부터 생성된 개별 객체를 의미합니다. 각 인스턴스는 독립적인 값을 가지며, 클래스에 정의된 속성과 메서드를 사용할 수 있습니다. 인스턴스 어트리뷰트(속성) : 인스턴스 어트리뷰트는 각 인스턴스마다 개별적으로 저장되는 데이터를 의미합니다. 보통 __init__ 메서드 내에서 정의됩니다. 클래스 어트리뷰트(속성) : 클래스 어트리뷰트는 클래스 자체에 속하는 변수로, 모든 인스턴스가 공유합니다. 메서드(methods) : 메서드는 클래스 내부에 정의된 함수로, 객체의 행동을 정의합니다. 메서드는 첫 번째 인자로 self를 받아 인스턴스의 속성과 상호작용합니다. 상속(inheritance) : 상속은 기존 클래스를 바탕으로 새로운 클래스를 정의하는 것입니다. 새로운 클래스는 기존 클래스의 속성과 메서드를 물려받습니다. 다형성(polymorphism) : 다형성은 동일한 메서드가 다른 객체에서 다르게 동작할 수 있게 하는 것입니다. 이는 주로 메서드 오버라이딩을 통해 구현됩니다. 캡슐화(encapsulation) : 캡슐화는 객체의 속성과 메서드를 외부에서 직접 접근하지 못하게 하고, 객체 내부에서만 접근할 수 있게 하는 것입니다. 보통 접근자와 설정자를 통해 구현됩니다. 추상화(abstraction) : 추상화는 객체의 복잡성을 줄이고, 필요한 부분만 노출하는 것입니다. 이는 추상 클래스를 통해 구현될 수 있습니다.
서경태
TIL 웹 개발 - class 이해하기 init, instance, method
팀프로젝트로 class를 사용하게 되었다. 하지만 class가 대략 미리 만들어놓고 나중에 또 쓰기 위한 거다 정도로 이해하고 있어서 이번 포스팅을 통해 이해해보기로 하자. init 일단, class 코드에 대해 찾아보면 항상 첫번째 함수는 __init__이 나온다. init은 아마 initiail, initiative, initiation 등의 약자로 우선적인 느낌을 가진 함수일 것이다. class 함수에서 init은 생성자(conductor)로 불리며 객체가 생성될 때, 자동으로 호출되는 특별한 메소드다. 좀 더 쉽게 이해하기 위해 역할에 대해 설명하면, 객체 초기화 : 객체가 생성될 때 필요한 초기 설정이나 값들을 초기화하기 위해 사용된다. 위 코드에서 이름과 나이에 대한 정보를 받는 프로그램을 만든다면 처음 데이터를 생성하는 역할을 한다는 것이다. 유연한 객체 생성 : 매개변수를 받아 객체 생성시 다양한 초기값을 설정할 수 있게 해줍니다. 그냥 새로운 객체를 생성할 때 이걸 사용해 쉽게 한다는 것이다. 위 코드 #객체생성 부분에서 보듯 person1 = class(데이터1, 데이터2) 를 넣어주면 바로 생성할 수 있다. 명확한 코드 구조 : class 함수의 기준이 되다보니 코드 구조가 한눈에 보기 쉽게 해준다. 추후 유지보수에도 도움이 된다. instance 인스턴스는 클래스에서 생성된 객체를 말한다. 위 코드에서 보면 person1, person2가 인스턴스에 해당한다. method 메소드는 클래스나 인스턴스에서 호출할 수 있는 함수를 말한다. 인스턴스 메소드 특정 인스턴스와 연관된 메소드로 self 매개변수를 통해 접근하고 조작한다. 위 코드에서 보면 def intoruduce(self): 가 인스턴스 메소드이다. 클래스 메소드 클래스 자체에 연관된 메소드로 데코레이터로 사용된다. 데코레이터는 다음 기회에 알아보자.
서경태