Dev
go언어에서 Java의 클래스, 속성, 메소드는 어떻게 구현이되?
DevOps Engineer
2025. 3. 2. 12:19
728x90
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