자바도 자바스크립트에서와 마찬가지로 큰 골자에서 본다면 공통적으로 객체(인스턴스)를 효율적으로 생산하는대에 클래스가 활용합니다. 그러나 세세하게 살펴보면 생성 방식에는 차이점이 있음을 찾아볼 수 있습니다.
자바스크립트의 객체 생성에는 프로토타입 기반 프로그래밍 방식을 따르는 반면, 자바의 객체 생성은 주로 클래스 기반 프로그래밍 방식을 따릅니다. 물론 자바스크립트도 클래스를 추가할 수 있지만, 해당 섹션에서는 JS와 Java의 객체 생성을 비교하기 위해 메인으로 사용되는 방법으로 비교해 보겠습니다.
// 클래스 정의 public class Person { // 필드 private String name; private int age; // 생성자 public Person(String name, int age) { this.name = name; this.age = age; } // 메서드 public void greet() { System.out.println("Hello, my name is " + name); } } // 상속 구현 public class Student extends Person { /필드 private String school; // 생성자 public Student(String name, int age, String school) { super(name, age); // 상속 받은 필드 this.school = school; } // 추가 메서드 public void study() { System.out.println(getName() + " is studying at " + school); } }
// 객체 생성 var person = { name: "John", age: 30, greet: function() { console.log("Hello, my name is " + this.name); } }; // 상속 구현 var student = Object.create(person); student.school = "ABC School"; student.study = function() { console.log(this.name + " is studying at " + this.school); }; // 객체 사용 console.log(person.name); // 출력: John person.greet(); // 출력: Hello, my name is John > console.log(student.name); // 상속 받음 student.greet(); // 상속 받음 student.study(); // 출력: John is studying at ABC School
자바스크립트에서 생성된 객체는 프로퍼티와 메서드에 대한 접근 제한자가 따로 없습니다. 따라서 어떤 속성이든지 어디서든지 접근할 수 있습니다. 반면에 자바에서 생성된 객체는 멤버에 대한 접근 제한자를 사용하여 해당 멤버에 대한 접근을 제한할 수 있습니다.
// 클래스 정의 public class Person { // private 접근 제한자를 사용하여 멤버 변수를 외부에서 직접 접근하지 못하도록 제한 private String name; private int age; // public 접근 제한자를 사용하여 생성자와 메서드를 외부에서 접근 가능하도록 설정 public Person(String name, int age) { this.name = name; this.age = age; } // public 접근 제한자를 사용하여 메서드를 외부에서 접근 가능하도록 설정 public void greet() { System.out.println("Hello, my name is " + name); } }
// 객체 정의 var person = { name: "John", age: 30, greet: function() { console.log("Hello, my name is " + this.name); } }; // 객체의 프로퍼티와 메서드에 어디서든 접근 가능 console.log(person.name); // "John" person.greet(); // 출력: "Hello, my name is John"
정리하자면 자바스크립트는 객체를 생성하기 위해서 기본적으로 리터럴을 이용한 방법이 제공되기 때문에 굳이 클래스로 객체를 생성하지 않아도 다양한 생성 방식으로 보다 유연한 객체 생성이 가능한 반면, 자바에서는 객체를 생성하기 위해서 주로 클래스를 사용하기 때문에 생성 과정 및 사용에 보다 번거로운 코드 작성 과정이 있다고 할 수 있겠습니다. (물론 두 언어 간의 객체 생성 방식에 대한 차이점일 뿐 객체로서의 역할 수행해는 문제가 없습니다.)