Go 언어에서 객체와 메서드 호출의 작동 원리
reader := bufio.NewReader(os.Stdin)
input, err := reader.ReadString('\n')
reader.ReadString('\n') 에서
- reader는 bufio.NewReader로 생성된 객체
- ReadString 은 메서드 라고 하고, bufio.NewReader(os.Stdin) 객체에서 호출가능한 메서드임.
reader의 정의와 역할
reader := bufio.NewReader(os.Stdin)
bufio.NewReader(os.Stdin):
- NewReader는 os.Stdin(표준 입력)에서 데이터를 읽기 위한 bufio.Reader 객체를 생성합니다.
- 반환된 객체는 *bufio.Reader 타입입니다.
reader:
- reader 변수는 *bufio.Reader 타입의 객체를 참조합니다.
- 이 객체에는 여러 메서드(ReadString, ReadBytes, ReadRune 등)가 정의되어 있어 호출이 가능합니다.
메서드 호출의 원리: reader.ReadString
객체의 메서드 정의
func (b *Reader) ReadString(delim byte) (string, error)
- ReadString은 bufio.Reader 타입에 정의된 메서드입니다
- (b *Reader)는 수신자(receiver)를 의미합니다.
- b *Reader는 포인터 리시버로 설정된 Reader 타입의 변수입니다.
리시버: 메서드가 특정 타입에 속하게 만들어주는 역할
- 다른 곳에서 Reader 타입의 변수를 사용하면 .을 통해 ReadString 메서드를 호출할 수 있습니다.
- *Reader 타입의 객체(reader)가 있어야 ReadString 메서드를 호출할 수 있습니다.
- Reader 타입은 Go 표준 라이브러리에서 제공하는 데이터 스트림을 읽는 데 사용되는 타입
1. 주로 io, bufio, 또는 strings 패키지에서 사용됨.
2. 파일, 문자열, 네트워크 연결 등 다양한 데이터 소스를 읽을 수 있도록 추상화된
인터페이스 또는 구조체를 가리킵니다.
3. Reader 타입은- 구조체 타입(struct type) 또는 인터페이스 타입(interface type)입니다.
4. Reader는, 기본 타입(int, string)처럼 단순히 값을 저장하는 것이 아니고,
데이터를 읽는 동작을 정의하거나 구현한 구조체 또는 인터페이스 타입입니다.
메서드 호출 구문
input, err := reader.ReadString('\n')
reader.ReadString('\n'):
- reader는 *bufio.Reader 타입의 객체입니다.
- reader.ReadString('\n')처럼 메서드를 호출하면, 내부적으로 reader가 b *Reader에 바인딩됩니다.
- reader는 ReadString 메서드의 수신자(receiver) 역할을 합니다.
- ReadString 메서드가 호출되면 reader 객체가 func (b *Reader)에서 b로 전달됩니다.
메서드 호출을 분해하면 다음과 같이 동작합니다:
- reader는 *bufio.Reader 객체입니다.
- ReadString 메서드를 호출할 때 reader가 메서드의 수신자 b로 전달됩니다.
- ReadString 메서드는 reader의 내부 데이터를 처리해 결과를 반환합니다.
. (dot) 연산자의 역할
- 객체가 가진 메서드나 필드에 접근할 때 사용됩니다.
- 메서드 호출 시 객체는 자동으로 수신자로 전달됩니다.
reader.ReadString에서 . 연산자는 다음과 같은 역할을 합니다:
객체의 메서드 접근:
- reader 객체가 가진 메서드 중 ReadString 메서드를 찾습니다.
- Go 컴파일러는 reader의 타입인 *bufio.Reader를 확인하고, 해당 타입에 정의된 ReadString 메서드를 호출할 수 있음을 알아냅니다.
메서드 호출 시 객체 전달:
bufio.ReadString(reader, '\n')
- reader.ReadString('\n')을 호출하면, 내부적으로 위와 같이 동작합니다
- 즉, reader 객체가 메서드의 첫 번째 매개변수로 암묵적으로 전달됩니다.
- 변수이름 := bufio.NewReader(os.Stdin) // 변수 이름
- input, err := 변수이름.ReadString('\n') // 변수이름 으로 메서드 호출
reader := bufio.NewReader(os.Stdin) // *bufio.Reader 객체 생성
// bufio.NewReader 함수가 호출되어 새로운 *bufio.Reader 객체를 생성합니다.
// reader 변수는 이 객체를 참조합니다.
// reader는 *bufio.Reader 객체입니다.
fmt.Println("Enter text:")
input, err := reader.ReadString('\n') // reader 객체의 ReadString 메서드 호출
// ReadString 메서드는 *bufio.Reader 타입에 정의된 메서드로, 객체에서 호출 가능합니다.
// 호출 시 reader 객체가 메서드의 수신자로 전달됩니다.
// reader 객체에서 ReadString 메서드를 호출합니다.
// reader는 ReadString 메서드의 수신자로 전달됩니다.
// delim 매개변수로 '\n'이 전달됩니다.
// ReadString 메서드는 reader 객체의 내부 버퍼에서 데이터를 읽습니다.
// 데이터는 '\n'이 나올 때까지 읽으며, 문자열로 반환합니다.
// 읽은 문자열(input)과 에러(err)를 반환합니다.
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("You entered:", input)