반응형

이번 5일차에서는 자바스크립트의 객체(Object)배열(Array)을 배우게 됩니다. 객체와 배열은 자바스크립트에서 가장 중요한 자료형으로, 데이터를 구조화하고 관리하는 데 매우 유용합니다.


객체(Object)

자바스크립트에서 객체는 키-값 쌍으로 이루어진 자료형입니다. 객체는 다양한 데이터를 그룹화하여 관리할 수 있는 방법을 제공합니다.

  1. 객체 리터럴 생성

    객체는 중괄호 {}를 사용하여 생성할 수 있습니다. 객체 안에는 속성(Property)값(Value)이 쌍으로 들어갑니다.

    • 객체 생성 예시:
      const person = {
          name: "John",       // 속성: name, 값: "John"
          age: 30,           // 속성: age, 값: 30
          isStudent: false    // 속성: isStudent, 값: false
      };
      console.log(person);
      // 출력: { name: "John", age: 30, isStudent: false }
  2. 객체의 속성 접근 및 수정

    객체의 속성에 접근할 때는 두 가지 방법을 사용할 수 있습니다: 점 표기법(.)과 대괄호 표기법([]).

    • 점 표기법:

      console.log(person.name);  // "John"
      person.age = 31;  // 값을 수정
      console.log(person.age);  // 31
    • 대괄호 표기법:

      console.log(person["isStudent"]);  // false
      person["isStudent"] = true;  // 값을 수정
      console.log(person["isStudent"]);  // true
  3. this 키워드 이해

    this 키워드는 함수 내부에서 현재 객체를 참조하는데 사용됩니다. 일반적으로 객체의 메서드 내에서 사용됩니다.

    • this 사용 예시:
      const person = {
          name: "John",
          age: 30,
          greet: function() {
              console.log(`Hello, my name is ${this.name}.`);  // this.name은 person 객체의 name 속성
          }
      };
      person.greet();  // "Hello, my name is John." 출력

    this는 메서드가 호출될 때 해당 메서드가 속한 객체를 참조합니다.


배열(Array)

배열은 순서가 있는 데이터 집합입니다. 배열은 여러 개의 값을 하나의 변수에 저장할 수 있으며, 배열의 각 값은 인덱스로 접근할 수 있습니다.

  1. 배열 생성과 값 접근

    배열은 대괄호 []를 사용하여 생성하며, 배열의 값은 0부터 시작하는 인덱스를 통해 접근합니다.

    • 배열 생성 예시:
      const numbers = [1, 2, 3, 4, 5];
      console.log(numbers[0]);  // 1 (배열의 첫 번째 요소)
      console.log(numbers[4]);  // 5 (배열의 다섯 번째 요소)
  2. 배열 메서드:

    배열에는 다양한 메서드가 있어 배열을 조작할 수 있습니다. 몇 가지 주요 메서드를 살펴보겠습니다.

    • push(): 배열의 끝에 새로운 요소를 추가합니다.

      numbers.push(6);
      console.log(numbers);  // [1, 2, 3, 4, 5, 6]
    • pop(): 배열의 마지막 요소를 제거하고 그 값을 반환합니다.

      const lastElement = numbers.pop();
      console.log(lastElement);  // 6
      console.log(numbers);  // [1, 2, 3, 4, 5]
    • shift(): 배열의 첫 번째 요소를 제거하고 그 값을 반환합니다.

      const firstElement = numbers.shift();
      console.log(firstElement);  // 1
      console.log(numbers);  // [2, 3, 4, 5]
    • unshift(): 배열의 첫 번째 위치에 새로운 요소를 추가합니다.

      numbers.unshift(0);
      console.log(numbers);  // [0, 2, 3, 4, 5]
  3. 반복문을 이용한 배열 순회

    배열을 반복문으로 순회하여 각 요소에 접근할 수 있습니다. for문, forEach() 메서드를 사용하여 배열을 순회할 수 있습니다.

    • for문 사용 예시:

      const fruits = ["apple", "banana", "cherry"];
      for (let i = 0; i < fruits.length; i++) {
          console.log(fruits[i]);  // "apple", "banana", "cherry" 출력
      }
    • forEach() 메서드 사용 예시:

      fruits.forEach(function(fruit) {
          console.log(fruit);  // "apple", "banana", "cherry" 출력
      });

실습

  1. 간단한 객체 만들기:

    • 목표: 이름, 나이, 직업을 가진 객체를 만들고, 그 값을 수정하거나 출력하는 실습.

    • 예시:

      const student = {
          name: "Alice",
          age: 22,
          major: "Computer Science"
      };
      
      console.log(student.name);  // "Alice"
      student.age = 23;  // 나이 수정
      console.log(student.age);  // 23
  2. 배열 만들기 및 배열 메서드 사용:

    • 목표: 배열을 생성하고, push(), pop(), shift(), unshift() 메서드를 사용하여 배열을 조작하는 실습.

    • 예시:

      const colors = ["red", "green", "blue"];
      colors.push("yellow");  // 배열에 "yellow" 추가
      console.log(colors);  // ["red", "green", "blue", "yellow"]
      
      const removedColor = colors.pop();  // 배열에서 마지막 요소 제거
      console.log(removedColor);  // "yellow"
      console.log(colors);  // ["red", "green", "blue"]
  3. 배열 순회하기:

    • 목표: 배열의 요소를 반복문이나 forEach()를 사용하여 순회하는 실습.

    • 예시:

      const animals = ["dog", "cat", "elephant"];
      animals.forEach(function(animal) {
          console.log(animal);  // "dog", "cat", "elephant" 출력
      });

정리

오늘은 자바스크립트의 객체배열에 대해 배웠습니다. 객체는 다양한 데이터를 속성으로 관리할 수 있는 방법을 제공하며, 배열은 순서 있는 데이터를 처리하는 데 유용합니다. 객체의 속성에 접근하고 수정하는 방법을 익혔고, 배열의 다양한 메서드를 활용하여 배열을 관리하는 방법을 배웠습니다. 실습을 통해 객체와 배열을 만들고, 그 값을 수정하거나 출력해보았습니다.

반응형
반응형

자바스크립트(JavaScript)에서 nullundefined는 많은 개발자가 헷갈려하는 개념 중 하나입니다. 둘 다 '값이 없음'을 나타내지만, 그 의미와 사용 방식이 다릅니다. 이번 글에서는 nullundefined의 차이를 상세히 분석하고, 실무에서 이를 어떻게 다뤄야 하는지 정리해보겠습니다.

1. null과 undefined의 기본 개념

1.1 undefined란?

undefined는 자바스크립트에서 '값이 할당되지 않은 변수'를 의미합니다. 즉, 변수를 선언했지만 값을 할당하지 않았을 때 기본적으로 설정되는 값입니다.

예제 코드

let a;
console.log(a); // undefined

위 코드에서 a 변수는 선언되었지만, 아무런 값도 할당되지 않았기 때문에 undefined가 출력됩니다.

1.2 null이란?

null은 프로그래머가 '의도적으로 값이 없음을 표현'하기 위해 사용하는 값입니다. 즉, 변수에 null을 할당하면 해당 변수는 '아무 값도 가지고 있지 않다'는 것을 의미합니다.

예제 코드

let b = null;
console.log(b); // null

위 코드에서 b 변수는 null 값을 가지며, 이는 개발자가 특정 변수가 비어 있음을 명확히 나타내기 위해 의도적으로 할당한 것입니다.

2. null과 undefined의 차이점

2.1 기본적인 차이

구분 null undefined
타입 object undefined
의미 값이 없음 (개발자가 명시적으로 지정) 값이 할당되지 않음 (자바스크립트가 자동으로 설정)
사용 예시 변수가 비어 있음을 의도적으로 나타낼 때 변수가 선언되었지만 값이 없을 때

2.2 typeof 연산자 결과

자바스크립트에서 typeof 연산자를 사용하면 nullundefined의 타입이 다르게 출력됩니다.

예제 코드

console.log(typeof null); // "object"
console.log(typeof undefined); // "undefined"

nullobject 타입으로 출력되는데, 이는 자바스크립트의 초기 설계 오류로 인해 발생한 현상입니다. 반면, undefined는 자신의 이름 그대로 undefined 타입을 반환합니다.

2.3 값 비교

nullundefined== 연산자로 비교하면 동등하다고 평가되지만, === 연산자로 비교하면 다르게 평가됩니다.

예제 코드

console.log(null == undefined);  // true
console.log(null === undefined); // false

== 연산자는 두 값의 타입 변환을 수행한 후 비교하기 때문에 true를 반환하지만, === 연산자는 타입까지 엄격히 비교하므로 false가 됩니다.

3. null과 undefined가 발생하는 경우

3.1 undefined가 발생하는 경우

  1. 변수를 선언했지만 값을 할당하지 않았을 때
    let x;
    console.log(x); // undefined
  2. 객체의 존재하지 않는 속성에 접근할 때
    let obj = {};
    console.log(obj.name); // undefined
  3. 함수에서 값을 반환하지 않았을 때
    function test() {}
    console.log(test()); // undefined
  4. 함수의 매개변수를 전달하지 않았을 때
    function greet(name) {
        console.log(name);
    }
    greet(); // undefined

3.2 null이 발생하는 경우

  1. 개발자가 의도적으로 변수에 값이 없음을 지정할 때
    let data = null;
    console.log(data); // null
  2. DOM 요소를 찾을 수 없을 때
    let element = document.getElementById("nonExistingId");
    console.log(element); // null

4. null과 undefined의 실무 활용법

4.1 null을 사용할 때

  • 변수가 '명확하게 값이 없음을' 나타내야 할 때
  • 초기화가 필요하지만 아직 데이터가 존재하지 않을 때
  • API에서 데이터를 가져오는 중 값이 없음을 나타낼 때

4.2 undefined를 사용할 때

  • 변수를 선언했지만 아직 초기화되지 않은 상태를 유지할 때
  • 함수의 매개변수를 받지 않았을 때 기본적으로 설정할 때
  • 객체 속성이 존재하지 않을 때

5. null과 undefined를 다룰 때 주의할 점

5.1 값이 없는 상태를 명확히 구분하기

  • '값이 없음을' 의미하는 경우에는 null을 사용
  • '변수 자체가 초기화되지 않은 상태'는 undefined를 유지

5.2 null과 undefined를 방지하는 코드 작성

기본값 설정하기

function getValue(value) {
    return value ?? "Default Value";
}
console.log(getValue(undefined)); // "Default Value"
console.log(getValue(null)); // "Default Value"

위 코드는 nullundefined 모두에 대해 기본값을 제공할 수 있도록 null 병합 연산자(??)를 활용하는 예제입니다.

6. 결론

자바스크립트에서 nullundefined는 비슷해 보이지만 중요한 차이점을 가지고 있습니다. undefined는 변수가 초기화되지 않았거나 존재하지 않는 속성에 접근했을 때 자동으로 할당되는 값이며, null은 개발자가 의도적으로 '값이 없음'을 나타낼 때 사용하는 값입니다.

이러한 차이를 이해하고 상황에 맞게 올바르게 사용하면 버그를 줄이고 코드의 가독성을 높일 수 있습니다. 실무에서는 nullundefined를 명확하게 구분하고, ?? 연산자나 default parameter 등을 활용하여 예상치 못한 오류를 방지하는 것이 중요합니다.

반응형

'개발 > Javascript' 카테고리의 다른 글

5일차: 객체와 배열  (0) 2025.01.31
4일차: 함수와 스코프  (0) 2025.01.30
3일차: 조건문과 반복문  (0) 2025.01.29
2일차: 데이터 타입과 연산자  (1) 2025.01.28
1일차: 자바스크립트 기본 개념과 변수  (0) 2025.01.27
반응형

Java 개발을 하다 보면 가장 자주 마주치는 예외 중 하나가 java.lang.NullPointerException: null입니다. 이 예외는 객체 참조가 null인 상태에서 이를 사용하려고 시도할 때 발생합니다. 많은 개발자가 처음에는 당황하지만, NullPointerException(NPE)의 원인을 정확히 이해하고 적절한 예방법을 익히면 이를 방지할 수 있습니다.

이번 글에서는 NullPointerException의 발생 원인과 해결 방법, 그리고 방지하는 방법까지 자세히 살펴보겠습니다.

1. NullPointerException이란?

NullPointerException(NPE)은 Java 프로그램이 실행되는 동안 null 값을 참조하려 할 때 발생하는 런타임 예외입니다. 일반적으로 다음과 같은 경우에 발생합니다.

  • null 객체의 메서드를 호출할 때
  • null 객체의 필드에 접근할 때
  • null 객체를 배열 인덱스로 사용할 때
  • null을 포함하는 컬렉션 요소를 참조할 때
  • null을 반환하는 메서드 결과를 직접 사용하려 할 때

예제 코드

public class NullPointerExample {
    public static void main(String[] args) {
        String str = null;
        System.out.println(str.length()); // NullPointerException 발생
    }
}

위 코드를 실행하면 NullPointerException이 발생하며 프로그램이 중단됩니다.

2. NullPointerException 발생 원인

2.1. 객체가 초기화되지 않았을 때

객체 변수를 선언했지만, new 키워드를 사용하여 인스턴스를 생성하지 않으면 null 상태로 남아 있습니다.

public class Test {
    private String name;
    public void printName() {
        System.out.println(name.length()); // NullPointerException 발생
    }
}

2.2. 메서드에서 null을 반환하는 경우

특정 메서드가 null을 반환했을 때 이를 확인하지 않고 사용하면 예외가 발생할 수 있습니다.

public class Test {
    public static String getMessage() {
        return null;
    }
    public static void main(String[] args) {
        String msg = getMessage();
        System.out.println(msg.toUpperCase()); // NullPointerException 발생
    }
}

2.3. 배열 요소가 초기화되지 않았을 때

배열이나 컬렉션 요소 중 일부가 null인 상태에서 이를 사용하려고 하면 예외가 발생할 수 있습니다.

public class Test {
    public static void main(String[] args) {
        String[] arr = new String[5];
        System.out.println(arr[2].length()); // NullPointerException 발생
    }
}

3. NullPointerException 해결 방법

3.1. null 체크 수행하기

객체가 null인지 확인한 후 사용하면 예외를 방지할 수 있습니다.

public class Test {
    public static void main(String[] args) {
        String str = null;
        if (str != null) {
            System.out.println(str.length());
        } else {
            System.out.println("str is null");
        }
    }
}

3.2. Optional 사용하기

Java 8부터 제공되는 Optional 클래스를 활용하면 null을 안전하게 다룰 수 있습니다.

import java.util.Optional;
public class Test {
    public static void main(String[] args) {
        Optional<String> optional = Optional.ofNullable(null);
        System.out.println(optional.orElse("Default Value"));
    }
}

3.3. try-catch 문 활용하기

예외가 발생할 가능성이 있는 코드를 try-catch 문으로 감싸면 프로그램이 중단되는 것을 방지할 수 있습니다.

public class Test {
    public static void main(String[] args) {
        try {
            String str = null;
            System.out.println(str.length());
        } catch (NullPointerException e) {
            System.out.println("Null 값이 참조되었습니다: " + e.getMessage());
        }
    }
}

4. NullPointerException 방지하는 방법

4.1. 객체를 초기화하는 습관 들이기

변수를 사용할 때 반드시 초기화하고, null 상태를 방지하는 것이 중요합니다.

public class Test {
    private String name = "default"; // 기본값 할당
    public void printName() {
        System.out.println(name.length());
    }
}

4.2. null-safe 메서드 사용하기

자바 11부터는 Objects.requireNonNullElse() 메서드를 활용하여 null을 안전하게 처리할 수 있습니다.

import java.util.Objects;
public class Test {
    public static void main(String[] args) {
        String name = null;
        String safeName = Objects.requireNonNullElse(name, "Default Name");
        System.out.println(safeName);
    }
}

4.3. Lombok @NonNull 어노테이션 사용

Lombok 라이브러리를 활용하면 null 값을 방지할 수 있습니다.

import lombok.NonNull;
public class Test {
    public void print(@NonNull String message) {
        System.out.println(message);
    }
}

5. 결론

NullPointerException은 Java 개발에서 흔히 발생하는 예외이지만, 원인을 이해하고 적절한 방법으로 처리하면 충분히 방지할 수 있습니다.

  1. null 체크를 철저히 수행하기
  2. Optional 활용하기
  3. 객체 초기화를 생활화하기
  4. try-catch 문을 활용하여 예외를 방지하기
  5. Lombok 등의 라이브러리를 적극 활용하기

이러한 방법을 익히고 실천한다면 NullPointerException을 효과적으로 예방하고 안정적인 Java 코드를 작성할 수 있을 것입니다.

반응형

+ Recent posts