[java] Java는 구조체를 지원합니까?

합니까 자바는 C ++의 아날로그 있습니다 struct:

struct Member {
  string FirstName;
  string LastName;
  int BirthYear;
};

내 데이터 유형을 사용해야합니다.



답변

Java에는 확실히 구조체가 없습니다. 🙂 그러나 여기에서 설명하는 것은 JavaBean 종류의 클래스처럼 보입니다.


답변

Java에서 구조체에 해당하는 것은 다음과 같습니다.

class Member
{
    public String FirstName;
    public String LastName;
    public int    BirthYear;
 };

그리고 올바른 상황에서는 잘못된 것이 없습니다. 캡슐화 된 데이터가있는 클래스를 사용할 때 구조체 구절을 언제 사용 하는가 측면에서 C ++에서와 거의 동일합니다.


답변

실제로 C ++의 구조체는 클래스입니다 (예 : 여기에서 메서드를 정의 할 수 있고 확장 할 수 있으며 클래스와 똑같이 작동 함). 유일한 차이점은 기본 액세스 수정자가 public으로 설정되어 있다는 것입니다 (클래스의 경우 private로 설정 됨). 기본적으로).

이것은 실제로 C ++의 유일한 차이점이며 많은 사람들이 그것을 모릅니다. ; )


답변

Java는 C ++의 구조체와 유사하지 않지만 모든 공용 멤버와 함께 클래스를 사용할 수 있습니다.


답변

Project JUnion을 사용하면 @Struct 주석으로 클래스에 주석을 달아 Java에서 구조체를 사용할 수 있습니다.

@Struct
class Member {
  string FirstName;
  string LastName;
  int BirthYear;
}

프로젝트 웹 사이트에서 더 많은 정보 : https://tehleo.github.io/junion/


답변

Java 14에는 빌드하기 매우 쉬운 구조화 된 데이터 유형 인 레코드에 대한 지원이 추가되었습니다.

다음과 같이 Java 레코드를 선언 할 수 있습니다.

public record AuditInfo(
    LocalDateTime createdOn,
    String createdBy,
    LocalDateTime updatedOn,
    String updatedBy
) {}

public record PostInfo(
    Long id,
    String title,
    AuditInfo auditInfo
) {}

그리고 Java 컴파일러는 AuditInfo레코드 와 연관된 다음 Java 클래스를 생성합니다 .

public final class PostInfo
        extends java.lang.Record {
    private final java.lang.Long id;
    private final java.lang.String title;
    private final AuditInfo auditInfo;

    public PostInfo(
            java.lang.Long id,
            java.lang.String title,
            AuditInfo auditInfo) {
        /* compiled code */
    }

    public java.lang.String toString() { /* compiled code */ }

    public final int hashCode() { /* compiled code */ }

    public final boolean equals(java.lang.Object o) { /* compiled code */ }

    public java.lang.Long id() { /* compiled code */ }

    public java.lang.String title() { /* compiled code */ }

    public AuditInfo auditInfo() { /* compiled code */ }
}

public final class AuditInfo
        extends java.lang.Record {
    private final java.time.LocalDateTime createdOn;
    private final java.lang.String createdBy;
    private final java.time.LocalDateTime updatedOn;
    private final java.lang.String updatedBy;

    public AuditInfo(
            java.time.LocalDateTime createdOn,
            java.lang.String createdBy,
            java.time.LocalDateTime updatedOn,
            java.lang.String updatedBy) {
        /* compiled code */
    }

    public java.lang.String toString() { /* compiled code */ }

    public final int hashCode() { /* compiled code */ }

    public final boolean equals(java.lang.Object o) { /* compiled code */ }

    public java.time.LocalDateTime createdOn() { /* compiled code */ }

    public java.lang.String createdBy() { /* compiled code */ }

    public java.time.LocalDateTime updatedOn() { /* compiled code */ }

    public java.lang.String updatedBy() { /* compiled code */ }
}

공지 사항 그뿐만 아니라 생성자, 접근 방법 equals, hashCode그리고 toString그것을 자바 레코드를 사용하기가 매우 편리합니다, 그래서 당신을 위해 만들어집니다.

Java 레코드는 다른 Java 객체처럼 생성 할 수 있습니다.

PostInfo postInfo = new PostInfo(
    1L,
    "High-Performance Java Persistence",
    new AuditInfo(
        LocalDateTime.of(2016, 11, 2, 12, 0, 0),
        "Vlad Mihalcea",
        LocalDateTime.now(),
        "Vlad Mihalcea"
    )
);

Java 레코드를 사용자 정의하는 방법에 대한 자세한 내용은 이 기사를 확인 하십시오 .


답변

네, 수업이 필요합니다. 클래스는 고유 한 유형을 정의합니다.