기억의 실마리
2024. 10. 6. 15:51

🎯Dart

Dart란 구글에서 만든 프로그래밍 언어로

객체지향 언어로 Flutter 개발에 특화된 언어이다.

Flutter는 멀티 플랫폼 대응이 뛰어난

프레임워크로 손꼽힌다.

 

JIT(Just-In-Time), AOT(Ahead-Of-Time)

컴파일 방식을 모두 사용하며

null safety를 지원한다.

 

개발중에는 JIT 컴파일방식으로 Hot-Reload가

가능하게 되어 빠른 속도로 변경사항을 확인 가능하고

 

배포할 때는 AOT 컴파일방식으로

실행이전에 컴파일을 완료하고 기계어를 전달하여

빠른 실행속도를 제공한다.

 

🤔Dart에 대한 견해

한국 서버구성 언어 점유율 1위 객체지향 프로그래밍인

JAVA와 유사하다는 느낌을 강하게 받았다.

 

최근에 공부하고 있던 JAVA언어와 생각보다

너무 유사해서 오히려 러닝커브가 덜 느껴진 것 같다.

 

같이 근무하고 있는 멋쟁이 JAVA 개발자가

Flutter를 공부할까 고민한 바 있었는데

적극 추천해도 무리가 없을 것 같다.

 

또한, 구글에서 만든 언어이기도 하고

Android, IOS 크로스플랫폼 일치율이 가장

높다고 언급되는 Flutter 개발도 기대가 된다.

 

  • 예제코드
void main() {

  /** ------------------------------  타입과 선언  -------------------------------- */

  // 변수 선언 시 var로 선언하는 것은 관습적으로 함수, 메서드 등 내부의 지역변수로서 선언할 때 많이 사용됨
  var name = "zeriong";
  name = "제리옹";

  // class내부에서 변수나 property의 경우 아래 처럼 타입 명시 선언을 활용한다고 함.
  String realName = "????";

  // dynamic type 은 어떤한 타입이라도 넣을 수 있다.
  // typescript 에서 활용되는 any와 같은 타입으로 볼 수 있다.

  // dynamic을 타입 명시로 활용하는 예
  dynamic anyType = "sdf";
  anyType = 123;
  anyType = false;
  anyType = {};

  // 아무것도 할당하지 않고 선언만 한 경우 자동으로 dynamic으로 선언된다.
  var dynamicVar;
  dynamicVar = 123;
  dynamicVar = true;
  dynamicVar = [];
  dynamicVar = "하이";

  // 하지만 다이나믹 타입으로 지정되어 있으면 해당 변수에 대해 추론이 안되어
  // 아래처럼 조건문을 추가해준다면 해당 변수에서 접근가능한 dart에서 자체 제공하는 매서드, api들을 활용할 수 있다.
  if (dynamicVar is String) {
    print("dynamicVar length is " + dynamicVar.length.toString());
  }

  /** 이상적으로 dart에서 dynamic 사용을 지양하는 것이 좋다. */

  print("hello, my name is " + name);

  // Null albe 선언 (typescript의 ?를 사용하는 옵셔널 체이닝과 같음)
  String? alias; // string 또는 null이 가능한 형태
  alias = "potato";
  alias = null;
  // 위에서 활용한 dynamic 타입과 마찬가지로 if문을 통해서 타입을 가정할 수 있어야 제공 메서드, api 활용 가능하다.
  if (alias != null) {
    alias.isNotEmpty;
  }
  // 또는 아래 처럼 활용 가능
  // typescript에서 활용할 때 처럼 있다면 이어서 실행될 것이고, 아닌 경우 그대로 멈추게 된다.
  alias?.isNotEmpty;
  alias?.length;

  // final을 활용한 상수 지정 (java의 final과 같다.)
  final constants = "this is a const";
  // constants = "nope"; // 컴파일 에러 발생

  // late는 초기화를 늦춰주는 역할을 한다. (값 초기화 이전에 발생하는 컴파일 에러를 방지해줌)
  // 아래 예시는 통신을 통해 상수로 활용할 값을 기다렸다가 통신 성공 시 지정해줄 때 이와 같이 활용할 수 있다.
  late final awaitResponseConst;
  awaitResponseConst = "i'm not modify";
  /** 이외의 다양한 케이스에 의한 late를 사용할 수도 있는데 이는 lateEx.dart 파일에 예시를 작성했다. */

  // const는 반드시 하드코디 되어야 한다. 즉, JS에서 처럼 사용자가 입력한 값을 const에 담아서 처리한다거나
  // api를 통해 받은 값을 const에 저장한다던가 하는 방식은 허용되지 않는다.
  const maxLength = 100;
  // 위처럼 반드시 내부적으로만 상수값으로 활용 될 때 사용하고
  // 통신을 통해 받거나, 유저 입력으로 받는 상수값인 경우는 final 또는 var를 활용해야 한다.

  /** ------------------------------  ㅡㅡㅡㅡㅡㅡ  -------------------------------- */

}

 

위 예제코드는 필자가 운영중인 Github에서 dart학습용

repository인 dart-intro에서 variable.dart 파일을

그대로 복붙했습니다.

Github: https://github.com/zeriong/dart-intro/blob/main/variables.dart

 

⭐유의사항

Dart언어에서 코드가 하나의 역할을 마치고 나서

세미콜론은 필수이다.

 

javascript에서 처럼 세미콜론을 생략한다고 auto formatter가

자동으로 추가 해주지 않고 dart에서 세미콜론 유무로

다른 기능으로 프로그래밍이 가능하기 때문에

필요에 의해 작성하거나 작성하지 않을 수 있기 때문이다.

 

✍️마치며...

이제야 Flutter개발자들이 말 끝마다 땀표(;)를 붙이는 이유를 알게 되었다... dart는 auto formatter가 세미콜론을 붙여주지 않기 때문에 반드시 세미콜론을 붙여야 한다. 이제부터라도 습관들여야겠다; 하하;

'Cross Platform' 카테고리의 다른 글

[ Flutter ] 크로스플랫폼 프레임워크  (1) 2025.05.04
2024. 10. 5. 16:31

🎛️OverRoading

오버로딩이란 특정 클래스나 메서드를 작성할 때 내부에서

추가적으로 이름은 동일하게 작성하고 각기 다른 파라미터를

전달받아 파라미터에 따라서 각기 다른 역할을 수행할 수

있도록 구성하는 방식을 오버로딩(OverRoading)이라고 한다.

(오버라이딩과 오버로딩 착각에 유의하자...)

 

  • 예제코드
public class MemberConstruct {
    String name;
    int age;
    int grade;
    
    MemberConstruct(String name, int age) {
        this(name, age, 45);
        System.out.println("case 1 : grade를 넘겨받지 않은 생성자 메서드 호출");
        System.out.println("name : " + this.name + "\n");
    }

    MemberConstruct(String name, int age, int grade) {
        this.name = name;
        this.age = age;
        this.grade = grade;
        System.out.println("case 2 : grade를 전달받은 생성자 메서드 호출");
        System.out.println("name : " + this.name + "\n");
    }
}

위 예제는 클래스를 생성할 때 전달받는 파라미터에 따라서 다른 결과를 만들어낸다.

 

✍️마치며...

java를 배우면서 javascript에서는 신경쓰지 않아도 될 것들을 모두 지정하거나 추가해주어야 하는 것이 번거롭지만 오히려 좀 더 본질적인 프로그래밍에 가깝다는 느낌 또한 받게되는 것 같다.

 

이후 이어서 dart와 flutter도 공부를 천천히 시작하고 있는데 dart언어 또한 java와 뭔가 비슷하다는 느낌을 지울 수가 없었다. 아직도 모르는게 너무 많고 배울 것이 정말 많다... (오히려 좋아)

2024. 10. 3. 18:05

🐎OverRiding

오버라이딩이란 부모로부터 상속받은 메서드의 기능을

재정의하는 것처럼 보이는 현상을 의미한다

 

특정 클래스에 extends를 활용하여 부모 클래스를 상속한 경우

해당 클래스는 상속한 부모의 메서드를 사용 가능하게 되는데

 

이 때 상속받은 메서드의 기능이 아닌 다른 기능을 필요할 때

overriding을 활용하여 상속받은 메서드를 같은 이름으로

원하는 새로운 기능의 메서드를 생성하여 마치 같은 메서드이지만

재정의한 것 처럼 활용할 수 있다.

 

overriding이 적용되는 방식은 절차적인 접근순서에 의해 적용된다.

 

  • 상속 메서드 실행 예시코드
// Parent.java
public class Parent {

	public void walk() {
    		System.out.println("let's walk!");
    	}
}

// IHaveParent.java
public class IHaveParent extends Parent {

	public void wait() {
    		System.out.println("now wait for parent");
    	}
    
    	public void stay() {
    		System.out.println("and i stay here.");
    	}
}

// IHaveParentMain.java
// ...
IHaveParent iHaveParent = new IHaveParent();
iHaveParent.walk();

 

위 예시코드를 보면 Parent 클래스는 walk라는 메드를 가지고 있다.

 

이러한 경우 IHaveParent 인스턴스에서 walk를 호출하면

가장 먼저 IHaveParent클래스 자기 자신에서 부터 해당 메서드를

탐색하게 된다.

 

이 후 탐색할 수 없다면 상속된 부모클래스에서 walk 메서드를

탐색하게 되고 있다면 실행하게 된다.

 

  • Overriding 예시코드
// Parent.java
public class Parent {

	public void walk() {
    		System.out.println("let's walk!");
    	}
}

// IHaveParent.java
public class IHaveParent extends Parent {

		// 자식 요소에도 있는 walk 메서드
        public void walk() {
            	System.out.println("let's walk, alone.");
            }

	public void wait() {
    		System.out.println("now wait for parent");
    	}
    
    	public void stay() {
    		System.out.println("and i stay here.");
    	}
        

}

// IHaveParentMain.java
// ...
IHaveParent iHaveParent = new IHaveParent();
iHaveParent.walk();

 

위는 overriding이 적용된 예시 코드이다.

 

마찬가지로 특정 메서드를 찾기 위해 메서드를 탐색하고 이 때

"자기 자신이 가진 메서드를 먼저 탐색한다"는 절차적 순서로

호출된 메서드명을 가진 메서드가 부모 뿐만 아니라

자식 클래스에서도 가지고 있다면

 

자식클래스(자기 자신)에서 우선 탐색 후 실행되어 부모가 가진

메서드가 마치 재정의 되어 실행되는 것처럼 보이는 현상을

overriding이라고 한다.

 

서술한대로 탐색 순서에 의해 발생되는 현상이지만

JAVA 개발자들은 이를 의도하여 활용하고자 

Override 라는 어노테이션이 만들었다.

 

부모가 상속된 클래스 내부에서 부모가 가진

메서드명으로 다른 기능의 메서드를 만들고

상단에 Override어노테이션을 사용한다면

해당 메서드명이 부모에 존재한다면 정상 실행되지만

 

해당 메서드명이 존재하지 않는다면 에러를 발생시켜

상속관계를 가진 클래스에서 분명한 의도를 가진

프로그래밍 설계가 가능하도록 활용할 수 있다.

 

  • @Override를 활용한 예시
// Parent.java
public class Parent {

	public void walk() {
    		System.out.println("let's walk!");
    	}
}

// IHaveParent.java
public class IHaveParent extends Parent {

		// Override 어노테이션을 활용
        @Override
        public void walk() {
            	System.out.println("let's walk, alone.");
            }

	public void wait() {
    		System.out.println("now wait for parent");
    	}
    
    	public void stay() {
    		System.out.println("and i stay here.");
    	}
        

}

// IHaveParentMain.java
// ...
IHaveParent iHaveParent = new IHaveParent();
iHaveParent.walk();

 

 

✍️마치며...

자바를 공부하며 새로운 프로그래밍 개념에 대해서 알아가며 새삼 프로그래밍 자체가 가진 프로세스, 로직은 얼추 비슷하게 적용되고 있음을 깨닫게 되는 것 같다. 특히나 자바와 (타입스크립트 + JS)는  무척이나 유사한 것 같다... 자바를 공부하며 기존에 다루었던 NestJS와도 많이 닮았다는 생각을 했는데 결과적으로는 타입스크립트가 자바를 이해하는데 크게 기여한 것을 느낄 수 있었다. 앞으로도 배워보고 싶은 언어, 프레임워크가 많은 만큼 더 열심히 해야겠다!

2024. 9. 28. 21:42

📚Convention

컨벤션은 말 그대로 예로부터 내려오는 일명 "국룰"이다.

convention을 직역하면 "전통적인"이라는 뜻으로

효율적으로 아키텍처를 구성할 수 있도록 인간의 사고력을

기준으로 누구나 이해하기 쉽도록 예로부터 내려오는

개발자들의 네이밍 방식, 폴더구조, 모듈화 방식 등을 의미한다.

 

🤔Why do we need conventions?

우리에게 컨벤션이 필요한 이유로 가장 먼저 떠오르는 것은

협업을 위한 컨벤션일 것이다.

 

팀과함께 프로젝트를 진행함에 있어 일관성을 만들어

하나의 약속으로서 팀원 간에 불필요한 커뮤니케이션을

최소화하기 위해서 컨벤션을 만드는 것이 일반적으로

떠올릴 수 있는 필요성으로 생각이 든다.

 

그렇다면 협업을 하지않는다면 컨벤션이 필요없는가?

 

그렇지않고 생각한다. 결과적으로 일관성을 지키는 것은 전체적인

아키텍처를 구성함에 있어 작업 효율성과 가독성을 증대시키는

효과를 기대할 수 있다.

 

혼자 프로젝트를 구성하여 서비스를 만든다고 하여도

개발자 커뮤니티에서 전통적으로 활용되는 아키텍처 컨벤션을

이해하며, 납득 가능한 근거를 기반으로 자기만의 컨벤션(기준)을

세워 꾸준히 일관성을 만들어간다면 기본적으로 설계가 빨라지고

유지보수면에서도 큰 이점을 가져올 수 있다.

 

🐈‍⬛git-commit-message-conventions

깃허브에 커밋 메시지를 남길 때 또한 컨벤션이 존재한다.

기본적으로 head, body, footer로 구분하여 활용하는데

너무 길어도 좋지 않기 때문에 일반적으로 head만 활용하여

간단명료하게 활용하는 것을 개발자들이 보편적으로

선호하는 방식인 듯 하다.

 

필자 역시 프로젝트를 만들어 진행할 때 head와 함께

간략하게 이전 코드에서 변경사항을 커밋메시지에 기록하는

방식으로 컨벤션을 꾸준히 지키고있다.

 

  • 커밋 메시지 예시
feat: 알림기능 추가
refactor: 글쓰기 기능 리렌더링 최적화
design: 변경된 디자인 시안 적용

 

⭐자주 쓰이는 commit message head

  • feat: 새로운 기능 추가
  • fix: 버그 수정 또는 typo
  • refactor: 리팩토링
  • design: CSS 등 사용자 UI 디자인 변경
  • comment: 필요한 주석 추가 및 변경
  • style: 코드 포맷팅, 세미콜론 누락, 코드 변경이 없는 경우
  • test: 테스트(테스트 코드 추가, 수정, 삭제, 비즈니스 로직에 변경이 없는 경우)
  • Chore: 위에 걸리지 않는 기타 변경사항(빌드 스크립트 수정, assets image, 패키지 매니저 등)
  • init: 프로젝트 초기 생성
  • rename: 파일 혹은 폴더명 수정하거나 옮기는 경우
  • remove: 파일을 삭제하는 작업만 수행하는 경우

 

✍️마치며...

개발자 취준생 초반에는 컨벤션이라는 개념이 없었지만 개인 프로젝트를 진행하며 기능이 많아지고 폴더 아키텍처가 복잡해질수록 프로그래밍을할 때 기준이 필요하다는 것을 깨닫게 되었다.

 

프로그래밍에도 컨벤션이 있다는 것을 알게되었고 어째서 컨벤션이 이러한 형식으로 이어져왔는지에 대한 공부를 하게 되었고, 이 후 클린코드에 대해서도 알게 되어 코드를 거듭 리팩토링하며 나만의 방식을 찾을 수 있게된 것 같다.

 

지금은 개발자로 취업하고서 협업을 하면서 컨벤션의 중요성을 뼈저리게 느끼며 팀원 모두가 납득할 수 있는 컨벤션을 제시하고 서로 맞춰가는 것 또한 개발자로서의 중요한 역량 중 하나라는 것을 느끼게 되었다.

2024. 9. 28. 20:17

⌨️Command

git commit --amend

 

  1. 위 명령어를 터미널에서 입력 후 i 를 입력하여 insert모드로 진입 후 메시지를 변경한다.
  2. esc 누르고 :wq 입력하여 설정모드에서 escape한다.
  3. 깔끔하게 적용할 땐 rebase를, PR기록을 남기고자 하는 경우는 merge를 한다.
2024. 9. 22. 21:42

🐻Zustand

Zustand가 가진 특징으로 가벼운 번들사이즈,

폭넓은 확장 가능성, provider가 없는 구조,

Flux패턴의 단방향 Pub/Sub 모델구조이다.

 

이러한 특징들로 요즘 대세 상태관리 라이브러리로

각광받고있다.

 

npm 공식 페이지에서 주간 다운로드 횟수를 보면

놀라운 주간 다운로드 횟수를 갱신중이다.

 

※ 2024-09-22 주요 상태관리 라이브러리 주간 다운로드 횟수

- Redux : 10,278,099

- Zustand : 4,243,907

- Redux-toolkit : 3,609,254

- Jotai : 1,177,983

- Recoil : 489,922

 

부동의 1위인 오리진 Redux를 제외한다면

Redux의 본체라 해도 무방한 Redux-toolkit 조차도 뛰어넘은

대세 상태관리 라이브러리이다.

 

이번 포스팅은 Zustand를 React에서 사용한다는 것을

기반으로 Zustand의 특징과 간단한 예제코드를

포스팅하고자 한다.

 

🪶가벼운 번들사이즈

Zustand는 획기적으로 가벼운 번들사이즈를 자랑한다.

고작 1.16kb의 사이즈 만으로 전체 상태를 용이하게

관리할 수 있어 프로젝트 자체의 용량을 더욱 가볍게

가져갈 수 있다.

 

🪝확장 가능성

redux와 같은 Flux패턴이기 때문에 redux의

reducer와 같은 개념으로 확장하여 유지보수성을

높일 수 있고 Zustand에서 제공하는 미들웨어를 통해

Redux dev-tools를 활용할 수 있어 디버깅에도

용이하게 확장이 가능하다.

 

🧺Provider가 없는 구조

이는 단순하게 생각하면 provider가 없어서 어쩌라고?

라는 생각이 들 수 있다. 하지만 React의 구조가 이를

엄청난 최적화요소로 만들어준다.

 

바로 Re-Render에 대한 최적화이다.

Provider로 감싸지 않는 구조로 상태 변화에 따른

불필요한 렌더링을 최소화 할 수 있게 되고

멀리보면 UX까지 영향을 끼칠 수 있는

핵심적인 요소라고 볼 수 있다.

 

📑Flux패턴의 구조

Flux패턴은 간단히 이야기 하자면 React와 Redux처럼

논리가 단방향으로 흐르는 아키텍처이며 대표적인 특징으로

디버깅이 쉽다는 특징을 가지고 있다.

 

  • Flux 패턴 시각화

사용자 입력을 기반으로 Action을 만들고 Dispatcher에

전달한 후 Store의 데이터를 변경하고 View에 반영하여

단방향의 흐름으로 작동하며, View에서 State 변경이 감지되면

순서대로 재실행한다. 이러한 흐름을 통해 누락없이

변경된 State를 반영할 수 있다.

 

🔍Pub/Sub (발행/구독) 모델

Pub/Sub 모델은 Publish/Subscribe의 축약어로 메시지 기반의

미들웨어 시스템을 말하며, 메시지를 전송할 때 publisher(발행자)가

subscriber(구독자)에게 직접 메시지를 전송하지만 Pub/Sub 모델은

발행자(Pub)는 어떤 구독자(Sub)가 있는지 모르는 상태에서

메시지를 전송하고 구독자(Sub)발행자(Pub)에 대한 정보 없이

자신의 Interest(구독한 것)에 맞는 메시지만을 전송 받는 것을 의미한다.

 

즉, Zustand에서는 스토어의 상태 변경이 일어날 때 실행할

Listener 함수를 모아 두었다가(sub), 상태가 변경되었을 때

등록된 Listener 에게 상태가 변경되었다고 알려준다(pub).

 

🧑‍💻예제코드

간단한 예제코드로 Zustand의 미들웨어를 사용하여 Redux dev-tools를 활용가능한 코드이다.

import type {StoreApi, UseBoundStore} from "zustand";
import {create} from "zustand";
import {devtools} from "zustand/middleware";

export interface ITestObjState {
  id: number;
  title: string;
  content: string;
}

export interface ITestStore {
  testState: string;
  testObjState: ITestObjState;
  setTestState: (payload: string) => void;
  setTestObjState: (payload: ITestObjState) => void;
}

export const useTestStore: UseBoundStore<StoreApi<ITestStore>> = create(
  devtools((setState, getState, store) => ({
    testState: "default value",
    testObjState: {id: 0, title: "title", content: ""},
    setTestState: (payload: string) => setState({testState: payload}),
    setTestObjState: (payload: ITestObjState) => setState({testObjState: payload}),
  })),
);

 

위 예제코드처럼 단순하게 devtools를 감싸주기만 하면 Redux dev-tools를 활용하여 디버깅이 가능해진다.

 

✍️마치며...

기존에 Redux로 상태관리 라이브러리를 입문했지만, Zustand를 접하고 나서부터는 Redux를 거의 사용하지 않았던 것 같다. 그 만큼 DX가 좋은 라이브러리라고 생각이 들었고 대세 라이브러리로 부상한 의미를 바로 알 수 있었다. 실제로 현재 다니는 회사에서 새로 시작하게된 프로젝트에서 이전 프로젝트에서 활용하던 Redux를 그대로 채용하자고 했을 때 Zustand를 적극 추천하며 팀원을 설득한 끝에 Zustand를 본격 도입할 수 있었다. 그 이후 모두에게 확실히 편하게 써서 좋다는 말을 듣고 팀 단위에서 DX를 높인 것 같아 괜히 뿌듯했다. ㅎ

2024. 9. 18. 13:54

Data Type

자료의 "형"을 뜻하며 말 그대로 데이터의 타입이다.

필자는 Frontend가 주력인 개발자로서 Javascript를 기본으로

개발을 해왔기 때문에 Typescript 를 활용하지 않는다면

모든 객체(함수, obj, arr 등)와 변수에 별도로 타입을 지정할 일이 없다.

 

하지만 JAVA 언어를 사용하기 위해서는 모든 클래스에

타입 지정이 필수이며, 사실 Javascript를 제외한다면 대다수의

언어에서 타입지정은 필수이다.

 

JAVA에서 정의하는 타입은 Javascript에서 정의하는 타입과 크게

다르지 않고 일부 개념을 제외하면 거의 동일한 구조이다.

Javascript에서 크게 원시타입, 참조타입으로 구분한다면

JAVA에서는 일반형, 참조형으로 구분하고 있다.

 

일반형 (Primitive Type)

Javascript에서는 원시타입으로 불리는 Boolean, Number 등과 비슷한 형태로

메모리상에서 실제 값을 가지고 있는 자료형을 말하며 아래와 같은 일반형이 존재한다.

 

- 기본형 타입의 특징

  1. 소문자로 구성 되어있다.
  2. 변수에 선언과 동시에 초기화되어 null이 아닌 초기값이 존재한다.
  3. 비객체 타입(참조형이 아님)으로 모두 null을 할당받을 수 없다.
  4. 저장공간에 실제 값을 가지고 있다.
  5. 모든 타입은 메모리 Stack에 저장된다.

 

- 오해할 수 있는 문자형 타입

문자형 타입중에 String과 char가 존재한다.

진정한 기본형인 문자형 타입은 char이며,

String은 JAVA에서 문자열을 좀 더 편하게 사용할 수 있도록

제공하는 참조형 타입이다. 그렇기 때문에 타입 구성이

소문자로 되어있지 않고 대문자로 시작하는 "String"인 것이다.

 

  타입 할당 메모리 크기 기본 값 범위
논리형 boolean 1byte false true, false
문자형 char 2byte (Unicode) '\u0000' 0 ~ 65,535
정수형 int (default) 4byte 0 -2,147,483,648 ~ 2,147,483,647
byte 1byte 0 -128 ~ 127
short 2byte  0 -32,768 ~ 32,767
long 8byte 0L -9,223,372,036,854,775,808
~ 9,223,372,036,854,775,807
실수형 float 4byte 0.0F (3.4 X 10-38) ~ (3.4 X 1038) 의 근사값
double (default) 8byte 0.0 (1.7 X 10-308) ~ (1.7 X 10308) 의 근사값

 

  • 일반형 예제 소스코드
class PrimitiveType() {
	int number;
    boolean isBoolean;
    double isDouble;
}

// number = 0
// isBoolean = false
// isDouble = 0.0

 

 

참조형 (Reference Type)

참조형 타입은 클래스, 배열, 열거형 타입 등을 참조형이라 하며,

변수에 할당되어 메모리상에 존재할 때 null 또는 객체가 가지는

참조가능한 주소를 할당할 수 있다.

 

- 참조형 타입의 특징

  1. 기본형과 다르게 실제 값이 아닌 데이터가 저장 되어있는 주소를 가진다.
  2. 참조형 내부의 값은 메모리 내부 힙(heap)에 저장하고 참조형 데이터가 가진 주소를 통해 접근가능하다.
  3. 참조형 변수는 null로 초기화 가능하고 이는 GC(Garbage Collection) 대상으로 이어질 수 있다.

 

타입 기본 값 할당 메모리 크기
배열 (Array) null 4byte
(주소만을 담기 때문)
열거 (Enumeration) null
클래스 (Class) null
인터페이스 (Interface) null

 

 

  • 참조형 예제 소스코드
class ReferenceType() {
	String title = "Title";
    String[] contents = new String[] { "배열임", "이것은 참조형" }
    Date date = new Date();
    Data data = new Data();
}

// title = "Title"
// contents = main.ref@682a0b20 (패키지경로@참조주소)
// date = main.ref@682a0b21 (패키지경로@참조주소)
// data = main.ref@682a0b22 (패키지경로@참조주소)

class Data() {
	int value;
    char content
}

 

 

마치며...

Javascript를 주력으로 개발을 하다보니 평소 자료형(Data Type)에 대해서 깊게 생각하지 못했던 것 같다. 타 언어에도 관심을 가지고 배우며 점점 개발자로서의 시야도 넓어지는 것 같다. 이번에 JAVA를 공부하면서 Javascript가 얼마나 편한 언어인지 깨닫는 계기가 되었다... JS 최고.

2024. 9. 15. 23:48

가장 자주 쓰일법한 코드 템플릿 단축키 6선

 

  • main 매서드 생성: psvm (PublicStaticVoidMain의 약자)
  • Run system Log print: sout (System.out.println)
  • 향상된 for문: iter
  • 일반 for문: itar
  • 일반 for문: itar
  • null 체크 if문: ifn
  • not null 체크 if문: inn

'IDEA' 카테고리의 다른 글

[ WebStorm - short cut ] 웹스톰 단축키  (0) 2024.10.13