[Spring_01]

jdoubleeyun·2021년 11월 14일
0

[자바_객체지향 프로그래밍]

1. 인스턴스의 생성과 힙메모리

인스턴스: 인스턴스가 선언이 되면 힙메모리, 즉 동적 메모리에 공간이 생성이 된다. 이때, 스택 메모리의 참조변수는 이 인스턴스의 동적메모리를 가리키게되고 참조변수의 참조값은 인스턴스의 주소값을 가진다. new 키워드를 사용하여 클래스를 메모리에 생성한 상태이다.
메서드: 멤버 변수를 이용하여 클래스의 기능을 구현한 함수이다.
힙메모리: 하나의 클래스로 부터 여러개의 인스턴스가 생성이 되고 각각 다른 메모리주소를 가진다.

2. 참조자료형과 접근제어자

참조자료형: 선언된 변수가 해당 클래스 내부에서 생성한 인스턴스가 아닌 경우에는 해당 클래스의 생성자에서 생성하여 사용한다.

protected 접근제어자: 상위 클래스에 선언된 private 멤버변수는 하위클래스에서 접근할 수 없음. 외부클래스는 접근 할 수 없지만 하위클래스는 접근 할 수 있도록 protected 접근제어자를 사용한다.

3. this와 super

this:
super: 클래스가 상속을 받은 경우, 하위클래스의 생성자에서는 반드시 상위클래스의 생성자를 먼저 호출함. super은 하위 클래스에서 가지는 상위클래스에 대한 참조값으로 상위클래스의 기본생성자를 호출한다. 따라서 반드시 상위클래스에는 기본생성자가 존재해야 한다. (상위클래스에 기본 생성자가 없을 경우: super(dhjs, dhsj)식으로 상위생성자의 명식에 따라 호출) 힙 메오리에 상위클래스의 인스턴스가 생성된 후 하위클래스의 인스턴스가 생성된다.
upCasting: Customer vc = new VIPCustomer();
vip 생성자에 의해 vip의 멤버변수에 대한 메모리는 생성이 되었지만, 변수 타입이 customer 이므로 실제 접근가능한 변수와 메서드는 상위클래스인 customer에 해당된다.
downCasting: 하위클래스의 메소드와 변수만이 사용가능. instanceof를 사용하여 원래의 인스턴스의 형이 맞는지 확인.

4. static

Static: 인스턴스가 생성될 때 만들어지는 변수가 아닌, 처음 프로그램이 메모리에 로딩될 때 메모리에 할당된다. 따라서 인스턴스 생성 전에 호출될 수 있으므로 static 매서드 내부에서는 인스턴스 변수 사용불가능. 클래스 변수, 정적변수라고 한다. 인스턴스의 생성과 상관없이 사용가능하므로 클래스 이름으로 참조된다. static변수는 인스턴스에서 공통으로 사용하는 영역. 새로운 객체를 생성할 때 활당이 가능하므로 객체마다 다른 값으로 할당이 가능하다.

SingleTon pattern:

5. 객체배열

System.arrayCopy(src, srcPos, dest, destPos, length)
자바에서 제공되는 배열 복사 매소드.
이는 생성자를 따로 생성하지 않고 시행하는 얕은 복사로 객체 주소만 복사되어 한쪽 배열의 요소를 수정하면 같이 수정됨.

6. Abstract class

구현코드 없이 매서드의 선언만 있음. 추상클래스는 인스턴스화 할 수 없으므로 new x

template_method: final 메서드를 사용하여 구현
하위 클래스에서 재정의할 수 없는 메서드로 전체적인 흐름을 정의함.

7. Interface

클래스의 상속과는 달리 구현코드가 없으므로 여러 인터페이스를 구현할 수 있다. 모든 메소드가 추상 메소드로 구현이 되는데, 동일한 메소드를 여러개의 상속클래스가 각각의 방식으로 구현할 수 있다. (인터페이스를 구현한 다양한 객체를 사용-다형성)
default method: 구현을 가지는 메소드로 인터페이스를 구현하는 클래스들에서 공통으로 사용할 수 있는 기본 메서드이다. 재정의도 가능(단, 인스턴스 생성 후)
static method: 인스턴스의 생성과 상관없이 인터페이스 타입으로 사용가능한 메서드.
private method: 재정의 불가능. default, static 메서드에서 사용.

8. JVM

자바와 운영체제 사이에서 중개자 역할을 수행하며, 자바가 운영체제에 구애 받지 않고 프로그램을 실행할 수 있도록 도와준다. 또한, 가비지 컬렉터를 사용한 메모리 관리도 자동으로 수행하며, 다른 하드웨어와 다르게 레지스터 기반이 아닌 스택 기반으로 동작한다.
(1) Class Loader
JVM 내로 클래스 파일을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈이다. 런타임 시에 동적으로 클래스를 로드한다.
(2) Execution Engine
클래스 로더를 통해 JVM 내의 Runtime Data Area에 배치된 바이트 코드들을 명렁어 단위로 읽어서 실행한다. 최초 JVM이 나왔을 당시에는 인터프리터 방식이었기 때문에 속도가 느리다는 단점이 있었지만 JIT 컴파일러 방식을 통해 이 점을 보완하였다. JIT는 바이트 코드를 어셈블러 같은 네이티브 코드로 바꿈으로써 실행이 빠르지만 역시 변환하는데 비용이 발생하였다. 이 같은 이유로 JVM은 모든 코드를 JIT 컴파일러 방식으로 실행하지 않고, 인터프리터 방식을 사용하다가 일정한 기준이 넘어가면 JIT 컴파일러 방식으로 실행한다.
(3) Garbage Collector
Garbage Collector(GC)는 힙 메모리 영역에 생성된 객체들 중에서 참조되지 않은 객체들을 탐색 후 제거하는 역할을 한다. 이때, GC가 역할을 하는 시간은 언제인지 정확히 알 수 없다.
(4) Runtime Data Area
JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역이다. 이 영역은 크게 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack로 나눌 수 있다.

[자바_알고리즘]

  • String[] array = (""+n).split("");
    Int, Long 타입을 String으로 변환 후 StringArray.

  • String.join("", array);
    StringArray type을 "?"로 사이를 이어 String화.

  • s.substring(index a, index b)
    String s의 a<= index < b 까지 출력.

  • list.sort(Comparator.naturalOrder());
    Collections.reverse(list);

  • Arrays.sort(array);
    Arrays.sort(array, 0, 4);
    Arrays.sort(arr,Collections.reverseOrder());

  • s=s.replace(,)
    s += "jdoubleeyun".repeat();
    s=s.toUpperCase();

  • Integer.valueof() : new Integer(Integer.parseInt(s))

  • for 조건문으로 코드 간추리는 메소드

  • Integer.parseInt()

  • 배열 중 최솟값의 인덱스를 찾아내는 메소드.

  • 중복 배열을 제거하는 메소드

  • 값의 기준점을 형성할 때

  • 중복되는 계산 없이 배열 원소들 계산하는 메소드

  • 반복되는 배열을 나머지로 해결하는 메소드

[개선 할 것]

https://d2.naver.com/helloworld/1230

[관련 자료]

https://github.com/Jdoubleeyun/programmers.git

profile
주니어 개발자 입니다.

0개의 댓글