Share
Sign In
TIL 웹개발
TIL 웹 개발 - class 이해하기 init, instance, method
서경태
👍
팀프로젝트로 class를 사용하게 되었다.
하지만 class가 대략 미리 만들어놓고 나중에 또 쓰기 위한 거다 정도로 이해하고 있어서 이번 포스팅을 통해 이해해보기로 하자.
init
일단, class 코드에 대해 찾아보면 항상 첫번째 함수는 __init__이 나온다.
class Person: def **init**(self, name, age): self.name = name # 인스턴스 변수 초기화 self.age = age # 인스턴스 변수 초기화 def introduce(self): print(f"Hello, I am {self.name} and {self.age} years old.") # 객체 생성 person1 = Person("Alice", 30) person2 = Person("Bob", 25) # 메서드 호출 person1.introduce() # "Hello, I am Alice and 30 years old." 출력 person2.introduce() # "Hello, I am Bob and 25 years old." 출력
init은 아마 initiail, initiative, initiation 등의 약자로 우선적인 느낌을 가진 함수일 것이다.
class 함수에서 init은 생성자(conductor)로 불리며 객체가 생성될 때, 자동으로 호출되는 특별한 메소드다.
좀 더 쉽게 이해하기 위해 역할에 대해 설명하면,
1.
객체 초기화 : 객체가 생성될 때 필요한 초기 설정이나 값들을 초기화하기 위해 사용된다.
위 코드에서 이름과 나이에 대한 정보를 받는 프로그램을 만든다면 처음 데이터를 생성하는 역할을 한다는 것이다.
2.
유연한 객체 생성 : 매개변수를 받아 객체 생성시 다양한 초기값을 설정할 수 있게 해줍니다.
그냥 새로운 객체를 생성할 때 이걸 사용해 쉽게 한다는 것이다. 위 코드 #객체생성 부분에서 보듯 person1 = class(데이터1, 데이터2) 를 넣어주면 바로 생성할 수 있다.
3.
명확한 코드 구조 : class 함수의 기준이 되다보니 코드 구조가 한눈에 보기 쉽게 해준다. 추후 유지보수에도 도움이 된다.
instance
인스턴스는 클래스에서 생성된 객체를 말한다. 위 코드에서 보면 person1, person2가 인스턴스에 해당한다.
method
메소드는 클래스나 인스턴스에서 호출할 수 있는 함수를 말한다.
1.
인스턴스 메소드
특정 인스턴스와 연관된 메소드로 self 매개변수를 통해 접근하고 조작한다.
위 코드에서 보면 def intoruduce(self): 가 인스턴스 메소드이다.
2.
클래스 메소드
클래스 자체에 연관된 메소드로 데코레이터로 사용된다. 데코레이터는 다음 기회에 알아보자.
Subscribe to 'kyugntae-ai'
Welcome to 'kyugntae-ai'!
By subscribing to my site, you'll be the first to receive notifications and emails about the latest updates, including new posts.
Join SlashPage and subscribe to 'kyugntae-ai'!
Subscribe
👍
Other posts in 'TIL 웹개발'See all
서경태
TIL 웹개발 - flask, request, form
먼저 html에서 form 형태를 작성한다. <form action:'/ 보낼 곳' method = '방식'> action : 어디로 보낼지 정하는 것이다. 파이썬에서 라우트하는 곳으로 설정한게 된다. method : form에서 지원하는 방식은 여러가지가 있는데 보통 get과 post를 사용한다. get은 검색처럼 데이터를 요청할때 사용한다. post는 로그인처럼 정보를 서버에 전달할 때 사용한다. <select name="요청 이름" — — —> <option value ="값"></<option> 부트스트랩에서 사용한 셀렉트 방식으로 가위바위보를 골라서 제출하도록 했다. name : 파이썬이 요청 받을때 여기서 정해진 이름으로 데이터를 받는다. value : name이란 데이터의 값을 말한다. 예를 들어, 가위바위보 게임을 한다면 name은 내가 낼 패를 말하고 value는 가위, 바위, 보 처럼 선택한 값을 말한다. <input button type ='submit'> 버튼을 통해 제출되도록 설정했다. 라우트를 사용해 html의 데이터를 받는다. 위에서 본 action 과 methods를 먼저 써준다. methods는 html에서 post만 사용했는데 왜 둘 다 써야할까? 그 이유는, 사용자가 웹페이지를 처음 방문할 때 기본적으로 get 요청을 통해 페이지를 로딩한다. 따라서 get 메서드를 포함하지 않으면 로딩시 오류가 생길수 있다. get을 사용하지 않더라도 꼭 둘 다 써야함을 기억하자! user_choice = request.form['user_choice'] 로 name과 같은 값을 통해 value값을 매개변수(user_choice 앞에 거)에 지정한다. 이렇게 하면 form은 정상적으로 작동한다.
서경태
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) : 추상화는 객체의 복잡성을 줄이고, 필요한 부분만 노출하는 것입니다. 이는 추상 클래스를 통해 구현될 수 있습니다.