본문 바로가기
Java

object oriented programming 개념 정리

by leko 2023. 7. 8.

오버로딩 : 매개변수의 개수나 타입이나 타입의 순서가 서로 달라야 한다

리턴 타입은 오버로딩과 관련없다.

 

객체소멸 : new 에 의해 생성된 객체 메모리를 자바가상기계의 가용메모리로 되돌림

가비지: 가리키는 레퍼런스가 하나도 없는 객체

자바가상기계의 가비지 컬렉터가 자동으로 가비지 수집 반환.

 

가비지 컬렉션 : 자동으로 가비지를 자동 회수하는 과정, 가용 메모리로 반환, 가비지 컬렉션 스레드에 의해 수행

개발자의 강제 가비지 컬렉션 : System.gc(); // 가비지 컬렉션 작동 요청 , 자바가상기계가 가비지 컬렉션 시점을 전적으로 판단

 

패키지 : 관련있는 클래스 파일을 저장하는 디렉터 

 

접근 지정자 목적: 클래스나 일부 멤버를 공개해 다른 클래스에서 접근하도록 허용하거나 캡슐화 정책(멤버를 보호하기 위해)에 묶인 보호를 일부 해제할 목적 2

private : 같은 클래스

default : 같은 패키지

protected : 같은 패지지 + 자식 클래스

public : 모든 클래스

 

인스턴스 멤버 = non - static 멤버

공간: 멤버들은 객체마다 독립적으로 존재

시간: 필드와 메소드는 객체 생성후 비로소 사용 가능

비공유: 멤버들은 다른 객체에 의해 공유되지않음

 

 

클래스 멤버 = static 멤버

공간: 클래스당 하나만 생성

시간: 클래스가 로딩될때 공간 할당

공유: 동일한 클래스의 모든 객체에 의해 공유

 

class area : static 멤버의 위치 , 클래스를 로드

heap : 인스턴스 멤버의 위치, 객체 메모리 할당

stack : 지역변수, 매개변수의 위치 , 스택 프래임 할당 main() f()

 

객체생성해서 레퍼런스변수로 스태틱 메서드를 접근할 수 있지만  클래스명.스태틱 멤버 로 사용하는게 좋음

 

스태틱메서드는 인스턴스 메서드를 호출할 수 없다!!!!!!!!

-> 정적 메서드는 정적 멤버만 사용할 수 있다

 

스태틱변수는 인스턴스 변수를 사용할 수 없다~!!!!!!!

스태틱 메서드는 객체가 생성되지않은 상황에서도 호출이 가능하므로 

-> 정적 메서드는 현재 객체를 가리키는 this레퍼런스를 사용할 수 없다

static void sub(int x) { this.x = x;} 는 오류다~~~!!!!!

 

when static member?

1. 전역변수나 전역함수는 static으로 클래스에 작성

2. 공유멤버를 작성할때 

 

final 클래스 = 종단 클래스 : 클래스상속 불가 / 보안상의 이유

final class FinalClass{}

class SubClass extends FinalClass{} //컴파일 오류

 

final 메소드 : 오버라이딩 불가

public class SuperClass {

     protected final int finalMethod(){}

}

class SubClass extends SuperClass {

     protected int finalMethod(){} // 오버라이딩 불가

 

 

static member : 동일한 클래스에 속한 객체들이 공유함.

즉, count 변수는 Counter 클래스의 모든 객체에 대해 공유되는 변수입니다. 객체 간의 상태를 공유하고 유지하는 데 유용하게 사용될 수 있습니다.

class Counter {
    static int count;

    public Counter() {
        count++;
    }

    public void displayCount() {
        System.out.println("Counter count: " + count);
    }
}

public class Main {
    public static void main(String[] args) {
        Counter c1 = new Counter();
        c1.displayCount(); // Output: Counter count: 1

        Counter c2 = new Counter();
        c2.displayCount(); // Output: Counter count: 2

        Counter c3 = new Counter();
        c3.displayCount(); // Output: Counter count: 3
    }
}

생성자 : 인스턴스가 생성될때 호출되는 인스턴스=객체 = iv 묵음 초기화 메서드

 

this : 인스턴스(객체) 자신을 가리키는 참조변수 , 인스턴스의 주소가 저장된다 (lv 와 iv를 구별하기 위해서~!)

this() :  생성자 , 같은 클래스의 다른 생성자를 호출할 때 사용한다. 반드시 첫줄에서만 사용 가능하다

 

 

오버라이딩 : 자식클래스가 부모클래스의 메소드를 자신의 필요에 맞춰서 재정의하는 것이다

매소드 이름 ,매개변수 , 반환형은 동일해야 한다~!

 

super : 자손클래스에서 조상클래스로부터 상속받은 멤버(메서드나 필)를 참조하는데 사용되는 참조변수

super(): 생성자 바로밑에 써야함.

 

다형성이란 조상클래스 타입의 참조변수자손클래스의 인스턴스를 참조할 수 있도록 하였다

 

참조변수의 형변환

자손타입의 참조변수를 조상타입의 참조변수로 변환하는 것을 업캐스팅,생략가능이라고 한다. 

Shape s = (Shape) new Rectangle();

Shape s = new Rectangle();

 

업캐스팅: 묵시적

다운캐스팅 : 명시

 

1. 업캐스팅의 활용

참조 매개변수는 메서드 선언시 훨씬 더 넓은 범위의 객체를 받을 수 있도록 조상타입 매개변수가 써져있고

호출할때는 자신과 같은 타입/ 자손타입의 인스턴스를 넘겨준다

 

2. instanceof 연산자 -  true / false 반환

변수가 가리키는 객체의 실제 타입을 알고싶으면

 

 

                                                                                         person

Student Researcher
  Professor

public static void print(Person person){ 

if(person instanceof Person){}  // kim의 조상이 Person 타입인가요?? yes

if(person instanceof Student){}// kim의 조상이 Student 타입인가요?? no

if(person instanceof Researcher){}// kim의 조상이 Researcher 타입인가요?? yes

if(person instanceof Professor){}// kim의 조상이 Professor 타입인가요?? yes

}

 

public static void main(String [] args){

Person jee = new Student();

Person kim = new Professor();

Person lee = new Researcher();

 

jee.print(); 

kim.print();

lee.print();

}

 

 

상속 is  이다  구성 has 가진다 , 클래스가 다른 클래스의 인스턴스를 클래스의 필드로 가지는 디자인 기법
컴파일 시간에 결정 실행시간에 결정 
사과는 과일이다. 사자는 동물이다. 집은 빌딩이다.
(화살표모양)
final로 선언된 클래스에서도 코드 재사용이 가능하다,
자동차는 엔진으로 구성된다.(검정 다이아몬드) - 구성
도서관을 책으로 구성된다.(꼭 필요함)(검정 다이아몬드) - 구성
연못이 오리를 소유한다.(흰 다이아몬드) - 집합
부모클래스의 public protected 매소드모두 노출한다 아무것도 노출X, 공개 인터페이스만을 사용해 상호작용한다

자동차는 엔진으로 구성된다.(꼭필요함)(검정 다이아몬드) - 구성
도서관을 책으로 구성된다.(꼭 필요함)(검정 다이아몬드) - 구성

public class A{
     private B b = new B();  // B객체가 A클래스안에 구성됨
     
     public A() {}
}

연못이 오리를 소유한다.(흰 다이아몬드) - 집합

publice class A{
    private B b; // B클래스타입의 참조변수 선언
    public A(B b){ 
         this.b = b;
         }
}

집합예제 

 

추상클래스추상 메소드 abstract void play (int pos);      를 갖고 있는 클래스  -> 주로 상속 계층에서 추상적인 개념을 나타낼때 사용

 

interface 추상메서드의 집합이다. 구현된 것이 전혀없다 . 모든 멤버가 public 

static method, default method, 상수는 부수적임 , 필드 변수는 선언불가

인터페이스는 다른클래스에 의하여 구현될 수 있다.

다중 상속이 가능 interface Fightable extends Movable , Attackable{ }

 

public interface RemoteControl {

     public void turnOn();

     public abstract void turnOff();

   

public static final int A = 5;


int myField; // 컴파일 에러: 인터페이스에서 필드 변수를 직접 선언할 수 없음   

 

default void defaultMethod() { System.out.println("This is a default method."); }

public default void printBrand() {    //default method

System.out.println("Remote Control 가능");

}

 

static void print (Stirng msg){     //static method

System.out.println(msg + "인터페이스의 정적 메소드 호출");

}

 

 

외부 클래스 outer

중첩 클래스  nested

 

중첩 클래스 - 정적 중첩 클래스

                    - 비정적 중첩 클래스      - 내부 클래스

                                                           - 지역 클래스

                                                           - 익명 클래스: 클래스 몸체는 정의되지만 이름이 없는 클래스이다. 익클래스는 클래를 정의하면서 동시에 객체를 생성하게 된다. 이름이 없기 때문에 한번만사용

package preparation;
interface Remote{
	void turnOn();
	void turnOff();
}
public class Pre_18 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		
		
		
		Remote r = new Remote() {
			public void turnOn() {
				System.out.println("Tv turnOn()");
			}
			
			public void turnOff() {
				System.out.println("Tv turnOff()");
			}
		}; //익명클래스 정의되면서 동시에 객체도 생성
	
	
	
	
	}

}

java.lang패키지는 자바프로그래밍에서 가장 기본이되는 클래스를 포함하기에 import문 없이도 사용가능하다

Object 클래스

boolean equals (Object obj) 객체 자신과 객체 obj가 같은 객체인지 알려준다(같으면 true 리턴)
Class getClass() 객체 자신의 클래스 정보를 담고있는 Class 인스턴스 반환
int hashCode() 객체 자신의 해시코드 값 리턴
String toString() 객체 자신의 정보를 문자열로 리턴
void notify() 현 객체에 대해 대기하는 하나의 스레드를 깨운다
vodi notifyAll() 현 객체에 대해 대기하는 모든 스레드를 깨운다
void wait() 다른 스레드가 깨울 때까지 현재 스레드를 대기한다
byte - Byte short - Short int  - Integer long - Long char - Character float - Float double - Double boolean - Boolean

기본타입의 값을 객체로 다룰 수 있게 함

 

Wrapper 객체생성

static 메서드 valueOf(문자열) 이용

 

Byte b = Byte.valueOf((byte) 10);

Short s = Short.valueOf((short) 10);

Integer i =Integer.valueOf (10);

Long l =Long.valueOf(10L);

Character c = Character.valueOf('c'); //문자열을 받지않음

Float f= Float.valueOf(3.14f);

Double d =  Double.valueOf (3.14);

Boolean b = Boolean.valueOf (true);

 

 

 

 

'Java' 카테고리의 다른 글

입출력 스트림과 파일 입출력  (0) 2023.07.13
12장 Collection FrameWork Generics  (0) 2023.07.10
11장 Collection FrameWork  (0) 2023.07.06
9장 Java.lang package & util classes  (0) 2023.07.04
5장 Array  (0) 2023.06.28