클래스란 객체를 정의하는 틀 또는 설계도와 같은 것을 말한다.
객체란 실생활에서 우리가 인식할 수 있는 사물을 말한다.
객체 지향 프로그래밍이란 모든 데이터를 객체(Object)로 취급하며, 이러한 객체가 바로 프로그램의 중심이 되는 것을 말한다.
다형성이란 하나의 객체가 여러 가지 타입을 가질 수 있다는 것을 의미한다.
오버로딩이란 매개 변수의 개수나 타입을 다르게 하여 같은 이름의 메소드를 정의할 수 있는 것을 말한다.
오버라이딩이란 상속 관계에 있는 부모 클래스에서 이미 정의된 메소드를 자식 클래스에서 다시 정의하는 것을 말한다.
static은 공통적인이라는 의미로 사용된다. 따라서 모든 객체가 공통으로 가져야 하는 것에 static을 붙인다. 이에 대한 예로는 아래와 같이 클래스 변수나 클래스 메소드가 있다.
private static Singleton uniqueInstance;
public static Singleton getInstance() {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
함수를 호출하는 방식으로는 다음과 같이 세 가지가 존재한다.
결론적으로 Java는 Call by value만 지원하는 언어이다. 이에 대한 예로는 아래와 같다.
/*
* Person.java
*/
package guitarggun;
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return this.name;
}
public int getAge() {
return this.age;
}
public void changeName(String name) {
this.name = name;
}
public void changeAge(int age) {
this.age = age;
}
}
/*
* Main.java
*/
package guitarggun;
public class Main {
public static void changeInfo(Person p1, Person p2) {
Person p3 = p1;
System.out.println("[chageInfo before] p1's info : ["
+ p1.getName() + ", " + p1.getAge() + "], "
+ "p2's info : [" + p2.getName() + " , "
+ p2.getAge() + "]");
p1 = p2;
p1.changeAge(0);
p2 = p3;
System.out.println("[chageInfo after] p1's info : ["
+ p1.getName() + " , " + p1.getAge() + " ], "
+ "p2's info : [" + p2.getName() + ", "
+ p2.getAge() + "]");
}
public static void changeArray(int[] arr1, int[] arr2) {
int[] arr3 = arr1;
System.out.println("[chageArray before]");
Main.printArray(arr1, arr2);
arr1 = arr2;
arr1[0] = 0;
arr2 = arr3;
System.out.println("[chageArray after]");
Main.printArray(arr1, arr2);
}
public static void printArray(int[] arr1, int[] arr2) {
System.out.print("arr1 : ");
for (int i = 0; i < arr1.length; i++) {
System.out.print(arr1[i] + " ");
}
System.out.print(", ");
System.out.print("arr2 : ");
for (int i = 0; i < arr2.length; i++) {
System.out.print(arr2[i] + " ");
}
System.out.println("");
}
public static void main(String[] args) {
Person guitarggun = new Person("guitarggun", 29);
Person john = new Person("john", 20);
System.out.println("<Object>\n");
System.out.println("[before] guitarggun's info : ["
+ guitarggun.getName() + ", " + guitarggun.getAge()
+ "], john's info : [" + john.getName() + " , " + john.getAge() + "]");
Main.changeInfo(guitarggun, john);
System.out.println("[after] guitarggun's info : ["
+ guitarggun.getName() + ", " + guitarggun.getAge()
+ "], john's info : [" + john.getName() + " , " + john.getAge() + " ]");
System.out.println("\n\n<Array>\n");
int[] arr1 = {1, 2, 3};
int[] arr2 = {7, 8, 9};
System.out.println("[before]");
Main.printArray(arr1, arr2);
Main.changeArray(arr1, arr2);
System.out.println("[after]");
Main.printArray(arr1, arr2);
}
}
Interface란 완전한 추상화를 목적으로 만들어졌으며, 구현해야 하는 규칙을 나열한 것이다. 기존 Interface에는 abstract method(추상 메소드)만 있었다. 하지만 Java 8부터 Interface에 default and static method가 추가되었다. 이에 대한 예로는 아래와 같다.
/*
* Human.java
*/
package guitarggun;
public interface Human {
/*
* abstract method
*
* to implement this method in the implementation classes
*/
public void sayAge();
/*
* default method
*
* can override this method in the implementation classes
*/
default public void sayHello() {
System.out.println("Hello");
}
/*
* static method
*
* cannot override this method in the implementation classes
*/
static public void sayPlanet() {
System.out.println("Earth");
}
}
/*
* Korean.java
*/
package guitarggun;
public class Korean implements Human {
public void sayAge() {
System.out.println("저는 다섯 살 입니다.");
}
@Override
public void sayHello() {
System.out.println("안녕하세요.");
}
}
/*
* American.java
*/
package guitarggun;
public class American implements Human {
public void sayAge() {
System.out.println("I'm seven years old.");
}
}
/*
* Main.java
*/
package guitarggun;
public class Main {
public static void main(String[] args) {
Korean korean = new Korean();
American american = new American();
korean.sayHello();
korean.sayAge();
american.sayHello();
american.sayAge();
Human.sayPlanet();
}
}
참고로 Interface Comparator를 보면 많은 메소드들이 있으나 무조건 구현해야 할 내용은 표시된 내용 뿐이다.
이상으로 Java를 마칩니다.