객체지향언어
객체지향언어의 특징
- 코드의 재사용성이 높다.(기존의 코드를 이용하여 새로운 코드를 작성)
- 코드의 관리가 용이하다. (코드의 관계를 이용하여 쉽게 코드를 변경)
- 신뢰성이 높은 프로그래밍이 가능하다.(제어자와 메서드를 사용해 데이터를 보호, 코드의 중복을 제거)
클래스와 객체
- 클래스: 객체를 정의해 놓은 것. 객체를 만들기 위한 설계도 같은 것. JDK(Java Development Kit)는 유용한 클래스(JAVA API)를 기본적으로 제공한다.
- 인스턴스: 클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화(instantiate)라고 하며 클래스로부터 만들어진 객체를 클래스의 인스턴스(instance)라고 한다.
인스턴스의 생성
Tv t; // 클래스명 변수명; t = new Tv(); // 변수명 = new 클래스명();
자바스크립트에서는 아래처럼 constructor를 만들고 인스턴스를 생성한다.
class Tv { // TV의 속성(변수) String color; boolean power; int channel; // TV의 기능(메서드, 함수) void power() { power = !power; } void channelUp() { ++channel; } void channelDown() { --channel; } } class TvSet { public static void main(String args[]) { Tv t1 = new Tv(); // t1를 통해 Tv인스턴스에 접근. Tv t2 = new Tv(); t1.channel = 7; t1.channelDown(); t2 = t1; System.out.println("현재 채널은 " + t2.channel + " 입니다."); // print 6; } }
Tv t를 선언함으로서 메모리에 t를 위한 공간이 생긴다.
new
를 통해서 Tv의 인스턴스가 메모리의 빈 공간에 생성된다. 그리고 대입연산자(=)에 의해 생성된 객체의 주소값이 참조변수 t1, t2에 저장된다.t2 = t1
가 시행되면 t2가 갖고 있던 주소값을 잃어버리고 t1에 저장되어 있는 주소값을 t2또한 참조하게 된다. t2가 기존에 참조하고 있던 인스턴스는 가비지컬렉터에 의해 자동 제거된다.
객체 배열
여러 개의 객체를 한꺼번에 생성하려면? 객체 배열을 생성하여 할 수 있다.
Tv[] tvArr = new Tv[3]; // 길이가 3인 객체 배열 생성 tvArr[0] = new Tv(); // 객체 배열의 각 요소에 저장 tvArr[1] = new Tv(); tvArr[2] = new Tv(); Tv[] tvArr = { new Tv(), new Tv(), new Tv() }; // 한줄로 선언과 초기화
메서드(Method)
- 특정 작업을 수행하는 일련의 문장들을 하나로 묶는 것이다. 수학의 함수와 유사하다.
- main()도 메서드로서 JVM에 의해 자바프로그램이 수행을 시작할 때 최초로 호출된다. main()은 자바프로그램 수행의 시작점이다.
- 리턴타입이 void일 때에 뭔가를 리턴할 수는 없지만
return;
을 사용하면 그 메서드를 종료하라는 뜻이다. - 자주 필요로 하는 기능을 추가 메서드로 만들어서 활용하는 것이 일반적이다.
배열을 매개변수로 하는 메서드
static int add(int[] p) { int result = 0; for(int data : p) { result += data; } return result; }
// 출력 public static void main(String[] args) { System.out.println(add(new int[] {10,20,30,40,50})) }
위처럼 배열을 패러미터로 하면, 매개변수가 몇개든 그 작업을 수행할 수 있다. 이것을 더 간단하게 할 수 있는 새로운 문법(가변인자)은 아래와 같다. (javascript의 rest operator와 매우 유사) 가변인자를 사용하려면 다른 매개변수와 구분할 수 있도록 맨 마지막 매개변수로 넣어야 한다.
static int add1(int...p) { // 타입 뒤에 ... int result = 0; for(int data : p) { result += data; } return result; }
// 출력 public static void main(String[] args) { System.out.println(add1(10,20,30,40,50)) // print 150 }
참고로 자바스크립트는 아래와 같다.
// Javascript function add(...args) { return args.reduce((a,b) => a+b); // reduce말고 당연히 for를 써도 된다. } add(10,20,30,40,50) // print 150
생성자 메서드(Constructor)
자바스크립트에는 Constructor가 있다.
// Javascript OOP function Bird(name) { this.name = name; this.Legs = 2; } let blueBird = new Bird("Sally"); blueBird.name; // print "Sally" blueBird instanceof Bird; // true(instance check)
자바에도 생성자 메서드가 있다. 문법이 완전 같다.
class Member3 { int i; String name; String account; String passwd; int birthyear; Member3() { System.out.println("객체 생성"); } Member3(String name, String account, String passwd, int birthyear) { this.name = name; this.account = account; this.passwd = passwd; this.birthyear = birthyear; } void print() { System.out.printf("회원%d : %s(%s, %s, %d)%n", i, name, account, passwd, birthyear); } } public class MemberTest3 { public static void main(String[] args) { Member3[] set = new Member3[3]; set[0] = new Member3("Alex", "Alex@mail.com", "secret1", 1990); ... } }
자바의 컨스트럭터는 오버로딩이 가능하며, 클래스 네임과 컨스트럭터 네임이 일치해야한다는 것이 특징이다.