🤍 JAVA 프로그래밍이란? 🤍
접근제어자 | 표시 | 설명 |
---|---|---|
public | + | 어떤 클래스의 객체에서든 접근 가능 |
private | - | 이 클래스에서 생성된 객체들만 접근 가능 |
protected | # | 이 클래스와 동일 패키지에 있거나 상속 관꼐에 있는 하위 클래스의 객체들만 접근가능 |
package | ~ | 동일 패키지에 있는 클래스의 객체들만 접근 가능 |
protected void finalize() throws Throwable { // 파일 닫기, 자원 반환 등 등 }
JAVA의 제네릭 (Generic)
처리 방법 : 타입 제거(type erasure) 라는 개념에 근거한다.
Vector<String> vector = new Vector<String>();
vector.add(new String("hello"));
String str = vector.get(0);
// 컴파일러가 아래와 같이 변환
Vector vector = new Vector();
vector.add(new String("hello"));
String str = (String) vector.get(0);
클래스 (Class)
객체 (Object)
인스턴스 (Instance)
즉, 인스턴스라는 용어는 반드시 클래스와 객체 사이의 관계로 한정지어서 사용할 필요는 없다.
인스턴스는 어떤 원본(추상적인 개념)으로부터 '생성된 복제본'을 의미한다.
/* 클래스 */
public class Animal {
...
}
/* 객체와 인스턴스 */
public class Main {
public static void main(String[] args) {
Animal cat, dog; // '객체'
// 인스턴스화
cat = new Animal(); // cat은 Animal 클래스의 '인스턴스'(객체를 메모리에 할당)
dog = new Animal(); // dog은 Animal 클래스의 '인스턴스'(객체를 메모리에 할당)
}
}
Q. 클래스 VS 객체
Q. 객체 VS 인스턴스
추상화 기법
① 분류 (Classification)
public double computeArea(Circle c) {...}
public double computeArea(Circle c1, Circle c2 {...}
public double computeArea(Square c) {...}
public abstract class Shape {
public void printMe() { System.out.println("Shape"); }
public abstract double computeArea();
}
public class Circle extends Shape {
private double rad = 5;
@Override // 개발자의 실수를 방지하기 위해 @Override(annotation) 쓰는 것을 권장
public void printMe() { System.out.println("Circle"); }
public double computeArea() { return rad * rad * 3.15; }
}
public class Ambiguous extends Shape {
private double area = 10;
public double computeArea() { return area; }
}
Call by Value (값에 의한 호출)
Call by Reference (참조에 의한 호출)
JAVA는 Call by Value 일까? Call by Reference 일까?
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "name is " + this.name;
}
}
public class FunctionCallTest {
public static void assignNewPerson(Person p) {
p = new Person("hee");
}
public static void changeName(Person p) {
p.setNaem("hee");
}
public static void main(String[] args) {
Person p = new Person("doy");
assignNewPerson(p);
System.out.println(p); // name is doy
changeName(p);
System.out.println(p); // name is hee
}
}
기본자료형은 Call By Value 이고, 참조자료형은 Call By Reference 이다?
추상 메서드(Abstract Method)
abstract 키워드와 함께 원형만 선언되고, 코드는 작성되지 않은 메서드
public abstract String getName(); // 추상 메서드
public abstract String fail() {return "Fail";} // 추상 메서드 X
추상 클래스 (Abstract Class)
/* 개념 a의 예시 */
abstract class Shape { // 추상 클래스
Shape() {...}
void edit() {...}
abstract public void draw(); // 추상 메서드
}
/* 개념 b의 예시 */
abstract class Shape { // 추상 클래스
Shape() {...}
void edit() {...}
}
/* 추상 클래스의 구현 */
class Circle extends Shape {
public void draw() { System.out.println("Circle"); } // 추상 메서드 (오버라이딩)
void show() { System.out.println("동그라미 모양");
}
}
인터페이스 (Interface)
인터페이스의 특징
a. 인터페이스는 상수 필드와 추상 메서드만으로 구성된다.
b. 모든 메서드는 추상 메서드로서, abstract public 속성이며 생략 가능하다.
c. 상수 public static final 속성이며, 생략하여 선언할 수 있다.
d. 인터페이스를 상속받아 새로운 인터페이스를 만들 수 있다.
* interface MobilePhone extends Phone { }
/* 인터페이스의 개념 */
interface Phone { // 인터페이스
int BUTTONS = 20; // 상수 필드 (public static final int BUTTONS = 20;과 동일)
void sendCall(); // 추상 메서드 (abstract public void sendCall();과 동일)
abstract public void receiveCall(); // 추상 메서드
}
/* 인터페이스의 구현 */
class FeaturePhone implements Phone {
// Phone의 모든 추상 메서드를 구현한다.
public void sendCall() {...}
public void receiveCall() {...}
// 추가적으로 다른 메서드를 작성할 수 있다.
public int getButtons() {...}
}
추상 클래스와 인터페이스의 공통점
추상 클래스와 인터페이스의 차이점
추상 클래스는 클래스이지만 인터페이스는 클래스가 아니다.
추상 클래스는 단일 상속이지만 인터페이스 다중 상속이 가능하다.
추상 클래스는 "is a kind if" 인터페이는 "can do this"
ArrayList
LinkedList
Vector
String
String + String + String ...
StringBuilder, StringBuffer
리플렉션(Reflection) 이란?
사용 방법
Class.forName("클래스이름")
클래스의 이름으로부터 인스턴스를 생성할 수 있고, 이를 이용하여 클래스의 정보를 가져올 수 있다.
public class DoHee {
public String name;
public int number;
public void setDoHee (String name, int number) {
this.name = name;
this.number = number;
}
public void setNumber(int number) {
this.number = number;
}
public void sayHello(String name) {
System.out.println("Hello, " + name);
}
}
import java.lang.reflect.Method;
import java.lang.reflect.Field;
/* ReflectionTest 클래스 */
public class ReflectionTest {
public void reflectionTest() {
try {
Class myClass = Class.forName("DoHee");
Method[] methods = myClass.getDeclaredMethods();
/* 클래스 내 선언된 메서드의 목록 출력 */
/* 출력 : public void DoHee.setDoHee(java.lang.String,int)
public void DoHee.setNumber(int)
public void DoHee.sayHello(java.lang.String) */
for (Method method : methods) {
System.out.println(method.toString());
}
/* 메서드의 매개변수와 반환 타입 확인 */
/* 출력 : Class Name : class DoHee
Method Name : setDoHee
Return Type : void */
Method method = methods[0];
System.out.println("Class Name : " + method.getDeclaringClass());
System.out.println("Method Name : " + method.getName());
System.out.println("Return Type : " + method.getReturnType());
/* 출력 : Param Type : class java.lang.String
Param Type : int */
Class[] paramTypes = method.getParameterTypes();
for(Class paramType : paramTypes) {
System.out.println("Param Type : " + paramType);
}
/* 메서드 이름으로 호출 */
Method sayHelloMethod = myClass.getMethod("sayHello", String.class);
sayHelloMethod.invoke(myClass.newInstance(), new String("DoHee")); // 출력 : Hello, DoHee
/* 다른 클래스의 멤버 필드의 값 수정 */
Field field = myClass.getField("number");
DoHee obj = (DoHee) myClass.newInstance();
obj.setNumber(5);
System.out.println("Before Number : " + field.get(obj)); // 출력 : Before Number : 5
field.set(obj, 10);
System.out.println("After Number : " + field.get(obj)); // 출력 : After Number : 10
} catch (Exception e) {
// Exception Handling
}
}
public static void main(String[] args) {
new ReflectionTest().reflectionTest();
}
}