-
go언어에서 Java의 클래스, 속성, 메소드는 어떻게 구현이되?Dev 2025. 3. 2. 12:19728x90
Go 언어는 Java와 같은 전통적인 객체지향 언어와는 다르게 클래스(Class) 개념이 없습니다. 대신, 구조체(Struct), 메서드(Method), 그리고 인터페이스(Interface) 를 활용하여 객체지향적인 프로그래밍을 구현할 수 있습니다.
✅ 1. Java의 클래스(Class) → Go의 구조체(Struct)
Java에서는 class 키워드를 사용하여 클래스를 정의하지만, Go에서는 struct를 사용하여 데이터를 정의합니다.
📌 Java 코드 (클래스 예제)
public class Person { String name; int age; public Person(String name, int age) { this.name = name; this.age = age; } public void sayHello() { System.out.println("Hello, my name is " + name); } }
📌 Go 코드 (구조체로 구현)
package main import "fmt" // Java의 클래스 대신 Go에서는 struct 사용 type Person struct { Name string Age int } // 생성자 역할을 하는 함수 (Go는 생성자를 지원하지 않음) func NewPerson(name string, age int) *Person { return &Person{Name: name, Age: age} } // Java의 메서드에 해당하는 함수 (struct에 메서드 추가) func (p *Person) SayHello() { fmt.Println("Hello, my name is", p.Name) } func main() { p := NewPerson("Alice", 25) p.SayHello() // 출력: Hello, my name is Alice }
📌 차이점
- Go에는 클래스가 없고, 대신 struct를 사용.
- 생성자는 없지만, NewPerson 같은 생성자 함수(Factory Function) 를 만들어 객체를 초기화.
- 메서드는 구조체에 func (p *Person) MethodName() 형태로 정의.
✅ 2. Java의 속성(Attribute) → Go의 구조체 필드(Struct Fields)
Java에서는 클래스의 속성을 private로 선언하고, getter/setter 메서드를 통해 접근합니다.
📌 Java 코드 (속성 접근)
public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
📌 Go 코드 (구조체 필드 접근)
package main import "fmt" type Person struct { Name string // 필드명이 대문자로 시작하면 public (exported) age int // 소문자로 시작하면 private (unexported) } // Getter 메서드 (Go에서는 직접 접근 가능하지만, 필요하면 getter 구현 가능) func (p *Person) GetAge() int { return p.age } // Setter 메서드 func (p *Person) SetAge(age int) { p.age = age } func main() { p := Person{Name: "Bob", age: 30} fmt.Println(p.Name) // 직접 접근 가능 fmt.Println(p.GetAge()) // Getter 사용 }
📌 차이점
- Go에서는 필드명을 대문자로 시작하면 public, 소문자로 시작하면 private.
- 직접 필드에 접근 가능하지만, 필요하면 Getter/Setter를 추가할 수도 있음.
✅ 3. Java의 메서드(Method) → Go의 메서드(Methods)
Java에서는 클래스 내에서 public void methodName() 같은 방식으로 메서드를 정의하지만,
Go에서는 구조체에 메서드를 추가할 때 메서드 리시버(Receiver) 를 사용합니다.📌 Java 코드 (메서드 예제)
public class Person { private String name; public Person(String name) { this.name = name; } public void sayHello() { System.out.println("Hello, my name is " + name); } }
📌 Go 코드 (구조체에 메서드 추가)
package main import "fmt" type Person struct { Name string } // 구조체의 메서드 정의 (리시버 사용) func (p *Person) SayHello() { fmt.Println("Hello, my name is", p.Name) } func main() { p := Person{Name: "Alice"} p.SayHello() // 출력: Hello, my name is Alice }
📌 차이점
- Go에서는 메서드 리시버(Receiver)를 사용하여 구조체에 메서드 추가.
- func (p *Person) MethodName() 형태로 정의.
✅ 4. Java의 인터페이스(Interface) → Go의 인터페이스(Interface)
Java에서는 interface를 정의하고 클래스에서 implements 키워드를 사용하여 구현합니다.
📌 Java 코드 (인터페이스 예제)
interface Animal { void makeSound(); } class Dog implements Animal { public void makeSound() { System.out.println("Woof Woof!"); } }
📌 Go 코드 (인터페이스 구현)
package main import "fmt" // Go 인터페이스 정의 type Animal interface { MakeSound() } // Dog 구조체 정의 type Dog struct{} // Dog 구조체가 Animal 인터페이스를 구현 (자동으로 인터페이스 만족) func (d Dog) MakeSound() { fmt.Println("Woof Woof!") } func main() { var a Animal = Dog{} // 인터페이스 타입 변수에 할당 가능 a.MakeSound() // 출력: Woof Woof! }
📌 차이점
- Go에서는 implements 키워드 없이, 자동으로 인터페이스를 만족하면 구현된 것으로 간주.
- Dog 구조체가 MakeSound 메서드를 가지면, 자동으로 Animal 인터페이스를 구현한 것으로 처리됨.
✅ 5. Java의 상속(Inheritance) → Go의 내장(Embedding)
Java는 extends 키워드를 사용하여 클래스 상속을 지원하지만,
Go는 상속이 없고, 대신 "구조체 내장(Embedding)"을 통해 재사용을 지원합니다.📌 Java 코드 (상속 예제)
class Animal { public void eat() { System.out.println("Eating..."); } } class Dog extends Animal { public void bark() { System.out.println("Woof Woof!"); } }
📌 Go 코드 (구조체 내장)
package main import "fmt" // Animal 구조체 정의 type Animal struct{} func (a Animal) Eat() { fmt.Println("Eating...") } // Dog 구조체가 Animal을 포함 (Embedding) type Dog struct { Animal // 상속 대신 포함(Embedding) } func (d Dog) Bark() { fmt.Println("Woof Woof!") } func main() { d := Dog{} d.Eat() // Animal의 메서드를 직접 호출 가능 d.Bark() // Dog의 메서드 호출 }
📌 차이점
- Go에는 클래스 상속이 없고, "구조체 내장(Embedding)"을 사용.
- Dog 구조체가 Animal을 포함하면, Animal의 메서드를 직접 호출 가능.
🔥 정리
클래스(Class) class 키워드 사용 struct 사용 속성(Attribute) private + Getter/Setter struct 필드, 대문자 = public, 소문자 = private 메서드(Method) 클래스 내부에서 정의 func (t *Type) Method() 형태로 정의 인터페이스(Interface) interface + implements interface 정의, 자동으로 구현 상속(Inheritance) extends 사용 구조체 내장(Embedding) 사용 💡 Go는 객체지향 언어가 아니지만, struct, method receiver, interface, embedding을 사용하여 객체지향 패턴을 지원합니다!
728x90'Dev' 카테고리의 다른 글
Go에서 함수와 상수 이름의 시작 규칙 (대문자 vs. 소문자) (0) 2025.03.03 Go 언어의 Goroutine이란? (0) 2025.03.02 Django에서 admin user 생성하기 위한 명령 (1) 2024.09.18 yarn 주요 명령어 (0) 2024.08.16 npm, pnpm, yarn, bun 비교 (0) 2024.08.16