JavaRush /Java Blog /Random-KO /커피 브레이크 #93. Java에서 String 클래스가 작동하는 방식. Java로 웹 인터페이스를 구...

커피 브레이크 #93. Java에서 String 클래스가 작동하는 방식. Java로 웹 인터페이스를 구현하는 방법 알아보기

Random-KO 그룹에 게시되었습니다

Java에서 String 클래스가 작동하는 방식

출처: DZone 저는 최근 한 포럼에서 다음 질문을 발견했습니다. “여기서 얼마나 많은 문자열 개체가 생성됩니까 ? 하나 또는 둘?".
String langName = new String("Java");
특히 Java에서 String 클래스가 작동 하는 방식에 대해 잘 알지 못하는 경우 복잡한 질문이라는 것을 알고 다른 사람들이 어떻게 대답했는지 궁금했습니다 . 그래서 댓글 섹션으로 뛰어들었습니다. 커피 브레이크 #93.  Java에서 String 클래스가 작동하는 방식.  Java에서 웹 인터페이스를 구현하는 방법 알아보기 - 1놀랍게도 댓글 작성자 중에는 '1'을 정답으로 선택한 분들도 계셨는데, '2'라고 답하신 분들이 더 많았습니다. 잠시 동안 나는 Strings 에 대한 나의 지식을 의심하기 시작했습니다 . 정답은 모든 것이 상황에 달려 있다는 것입니다. 질문은 충분히 명확하지 않으며 논쟁의 여지가 있습니다. 나는 이것을 다음과 같이 바꿔 말하고 싶습니다.

1. 이 명령문이 실행될 때 메모리에 몇 개의 Java String 객체가 생성됩니까?

답은 하나뿐입니다.

이 명령문을 실행한 후 메모리에 얼마나 많은 Java String 객체가 남아 있습니까?

대답은 두 가지입니다. 위의 예와 같은 명령문을 사용하여 프로그램의 메모리 덤프를 확인한 후에 불확실성이 사라졌기를 바랍니다. 커피 브레이크 #93.  Java에서 String 클래스가 작동하는 방식.  Java - 2에서 웹 인터페이스를 구현하는 방법 알아보기위 이미지의 프로그램 메모리 덤프는 동일한 내용을 가진 두 개의 String 개체가 있음을 보여줍니다. 이는 String 클래스 생성자를 호출하고 문자열 리터럴을 인수로 전달하면 두 개의 객체가 메모리 힙에 추가된다는 것을 증명합니다. 하나는 일반(풀이 아닌) 메모리에 있고 다른 하나는 문자열 상수 풀(SCP)에 있습니다. 힙의 일부이기도 한 메모리 영역입니다. 추가 후 어려움이 시작됩니다. 생성자를 호출하면 항상 새 개체가 풀이 아닌 영역에 배치됩니다. 그러나 문자열 리터럴인 생성자 인수도 객체이며, 문자열 풀에 동일한 내용의 문자열이 포함되어 있지 않다면 클래스 로딩 중에 SCP에 생성 및 저장됩니다. Java 언어 사양에는 "문자열 리터럴(더 일반적으로는 상수 표현식(§15.28)의 값인 문자열)이 "인턴"되어 문자열 메소드 . intern "을 사용하여 고유한 인스턴스를 공유한다고 명시되어 있습니다 . Java의 문자열은 리터럴이므로 상수 표현식의 값을 나타내므로 풀링됩니다. 이를 더욱 명확하게 하기 위해 기사 시작 부분에 제시된 코드를 다음과 같이 다시 작성해 보겠습니다.
String java = "Java";
String langName = new String(java);
이제 주요 질문으로 돌아가 보겠습니다. 다음 명령문은 하나 또는 두 개의 String 객체를 생성합니까 ?
String langName = new String("Java");
이 질문에 답하고 의심을 없애기 위해 기본 메소드의 바이트코드를 살펴보겠습니다.
public static main([Ljava/lang/String;)V
   L0
    LINENUMBER 11 L0
    NEW java/lang/String
    DUP
    LDC "Java"
    INVOKESPECIAL java/lang/String. (Ljava/lang/String;)V
    ASTORE 1

   L1
    LINENUMBER 14 L1
   FRAME APPEND [java/lang/String]
    GOTO L1

   L2
    LOCALVARIABLE args [Ljava/lang/String; L0 L2 0
    LOCALVARIABLE langName Ljava/lang/String; L1 L2 1
    MAXSTACK = 3
    MAXLOCALS = 2
6행에서는 LDC(Load Constant) 명령을 볼 수 있습니다. 문자열 상수 풀의 요소를 스택으로 로드합니다. 이는 생성자가 호출될 때 객체이기도 한 Java 리터럴이 이미 풀에 추가되었음을 의미합니다. 클래스를 로드하는 동안 이런 일이 발생했습니다. 따라서 문자열 리터럴을 사용하여 String 클래스 생성자를 호출 하면 개체가 하나만 생성되고 풀링되지 않은 메모리 위치에 배치됩니다.

Java로 웹 인터페이스를 구현하는 방법 알아보기

출처: Dev.to JavaScript의 세계는 유용하고 재미있는 웹 프레임워크를 제공하므로 의심의 여지가 없습니다. Java 개발자를 위한 흥미로운 대안이 있습니다. 바로 오픈 소스 Vaadin 프레임워크입니다. 이를 통해 Java 프로그래밍 언어만 사용하여 웹용 그래픽 사용자 인터페이스 (GUI)를 쉽게 구현할 수 있습니다. HTML이나 JavaScript를 한 줄도 작성할 필요가 없습니다. 천 마디 말보다 한 장의 사진이 더 중요합니다. 커피 브레이크 #93.  Java에서 String 클래스가 작동하는 방식.  Java - 3에서 웹 인터페이스를 구현하는 방법 알아보기

바딘은 어떻게 작동하나요?

스크린샷 왼쪽에 Java 클래스가 표시됩니다. 이 코드는 Apache Tomcat, Eclipse Jetty 또는 기타 서블릿 컨테이너와 같은 서버에서 실행됩니다. 플랫폼에서 제공하는 API를 사용하여 텍스트 필드, 콤보 상자, 데이터 그리드, 날짜 선택기, 업로드 필드 등과 같은 사용자 인터페이스(UI) 구성 요소를 만들 수 있습니다. 이러한 구성 요소를 결합하여 보기(페이지 또는 UI라고도 함)를 생성하고 레이아웃을 사용하여 UI(사용자 인터페이스) 구성 요소를 수직, 수평 또는 CSS를 사용하는 다른 방식으로 정렬할 수 있습니다. 이전 예제에서는 TextFieldButton을 VerticalLayout 에 추가하여 만들었습니다 . 뷰가 준비되면 @Route 주석 을 사용하여 URL을 통해 열 수 있습니다 . 이 예에서는 @Route("hello") 를 사용하여 http://localhost:8080/hello에서 사용할 수 있도록 했습니다 . Vaadin 애플리케이션은 Java로 작성된 웹 애플리케이션입니다. 프레임워크는 HTTP 요청과 응답을 처리하는 서블릿 구현( VadinServlet )을 제공합니다. 이 서블릿은 @Route 주석 으로 표시된 Java 클래스를 검색하여 브라우저에 올바른 보기를 표시합니다. Vaadin 애플리케이션이 처음 요청되면 Vaadin은 클라이언트 엔진 역할을 하는 경량 JavaScript 파일로 응답합니다. 이 엔진은 브라우저에서 이벤트를 처리하고 이를 JSON 메시지로 서버에 보내는 작업을 담당합니다. VaadinServlet 객체는 요청을 처리하고 마찬가지로 클라이언트 측 엔진에 JSON 응답을 반환합니다. 그런 다음 엔진은 이 메시지를 사용하여 업데이트해야 하는 페이지의 요소(있는 경우)를 업데이트합니다. Vaadin은 HTTP 세션을 사용하여 사용자 인터페이스의 상태를 포함하는 구성 요소 트리를 저장합니다. 구성 요소와 같은 것들은 표현과 해당 상태(활성화/비활성화, 캡션, 값 등)를 형성합니다. 이 모든 것은 언급할 가치가 있는 보안 수준을 제공합니다. 사용자 인터페이스 로직은 서버에 있으므로 공격자가 접근할 수 없습니다. 검사는 서버에서 수행됩니다. 예를 들어, setEnabled(false) 를 사용하여 버튼을 비활성화하면 이는 브라우저의 단순한 외관 기능이 아닙니다. 서버는 비활성화된 버튼에 추가된 클릭 리스너에서 어떤 로직도 실행하지 않으므로 공격자가 브라우저에서 개발자 도구를 악용하는 것을 방지합니다. 활성화된 상태를 변경하거나 VaadinServlet을 호출하여 마우스 클릭(클릭 이벤트)을 시뮬레이션합니다.

Vaadin은 무료로 사용할 수 있나요?

예. Vaadin은 Apache License 2.0에 따라 게시된 오픈 소스 프레임워크입니다. 본격적인 웹 애플리케이션을 만들기 위해 아무것도 구입할 필요가 없습니다. 성능을 향상시키는 상용 구성 요소가 있지만 필수는 아닙니다. 예를 들어, 뷰를 더욱 빠르게 생성하는 데 도움이 되는 비주얼 디자이너 와 CRUD 구성 요소가 있습니다 . 구독하기 전에 이러한 구성 요소를 무료로 사용해 볼 수 있습니다.

Vaadin은 JSP 및 JSF를 대체합니까?

예. JSP, JSF 및 Angular와 같은 JavaScript 프레임워크를 대체하는 데 사용할 수 있습니다. 많은 Vaadin 고객이 이러한 기술에서 Vaadin으로 성공적으로 마이그레이션했습니다.

Vaadin은 Spring 및 Jakarta EE를 지원합니까?

예. Vaadin은 Spring 및 Jakarta EE(이전 Java EE)와 공식적으로 통합되어 있습니다. Spring Initializr를 사용하여 새 Spring Boot 프로젝트를 생성할 때 Vaadin을 종속성으로 추가할 수 있습니다. Jakarta EE의 경우 Jakarta EE를 사용하는 간단한 Hello, World 예제를 다운로드할 수 있습니다. 이 기사를 작성하는 시점에서는 Jakarta EE 버전 8만 지원됩니다.

누가 Vaadin을 사용합니까?

많은 Fortune 500대 기업은 물론 성공적인 스타트업과 전 세계 20만 명 이상의 개발자도 Vaadin을 사용합니다. 빠른 시작 가이드 및 기타 Vaadin 문서를 확인하세요 .
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION