관리 메뉴

제뉴어리의 모든것

[Section1][Java] 객체지향 프로그래밍 기초 - 1 본문

코드스테이츠/정리 블로깅

[Section1][Java] 객체지향 프로그래밍 기초 - 1

제뉴어리맨 2022. 7. 7. 18:22

객체 지향프로그래밍이란

현실 세계의 모드것이 객체로써(무형한것도 사물로 취급한다는 가정) 존재하듯이 프로그래밍을 할때도 특성과 기능을 가진 대상에 대하여 모두 객체로써 만들어 프로그래밍하는 기법

 

객체 지향 프로그래밍의 장점

프로그래밍 하면서 특성 기능을 가진것을 모두 객체로써 만들어 둠으로써 개발자는 목적에 따라 각각의 객체를 조합하여 개발이 가능하므로 개발의 효율성이 좋아지고 직관적으로 인지하며 개발을 할 수있다.

 

클래스란

객체의 특성 기능들을 모아 놓은 틀로써 객체를 생성하기 위해 만들어 놓은 설계도.

 

객체란

클래스란 틀로 찍어낸 하나하나의 존재.

 

메모리영역

[  클래스 영역  ] [  스택 영역   ]  [   힙 영역   ]

 

 

객체의 생성

EX : Person personInstance = new Person();

 

: Person -> personInstance라는 변수가 어떤 타입의 객체를 담을것인지에 대한 선언

: personInstance -> 객체의 주소(객체의 Heap 공간안에서의 위치) 가지고 있는 참조변수. 실제 객체의 핸들링이 가능

: new -> 생성된 객체를 힙 메모리에 넣으라는 명령 키워드

: Person(); -> Person이란 객체 생성에 대한 선언

 

  • Person personInstance = new Person(); 프로그램 구동시 메모리상의 적재 상황

    [   클래스 영역   ]  : 프로그램 구동과 동시에 클래스로더에 의해 적재되는 영역
    - Person 클래스, (객체가 아니다)
    - Person 내에 존재하는 메서드 내용

    [   스택   ]  : 위에 코드가 진행 될때 적재되는 영역.
    - personInstance 참조변수 (힙 영역에 있는 Person 객체의 시작 주소값을 가지고 있다)

    [   힙   ]  : 위에 코드가 진행 될때 적재되는 영역.
    - new Person() 구문으로 인해 생겨난 실제 객체.


    + new : 힙 메모리에 저장 키워드


    • 힙 영역의 객체와 클래스 영역의 메서드 내용의 관계
      힙 영역에는 실제 객체가 존재 한다고 했다.
      그렇다면 그 객체 안에는 멤버 변수, 멤버 메서드를 가지고 있을텐데,
      이때, 힙 안에 있는 객체의 메서드 영역은 클래스 영역안에 있는 메서드내용 영역을 가리키고 있다.
      왜냐하면 객체는 각각 고유한 객체로써 생성이 되야 하지만, 그 객체들에 있는 메서드의 내용은 모두 동일하기 때문에 클래스 영역에 적재 되어 있는 하나의 내용만을 참조하면 되기 때문이다. (객체의 속성값은 모두 다를 수 있지만, 메서드의 내용은 달라지지 않기 때문이다.)

포인트 연산자

객체나 클래스에 접근할때 . 기호를 이용하여 해당 주소로 이동하여 멤버 변수, 멤버 메소드에 접근하겠다는 의미이다.

 

클래스의 종류

  • 일반 클래스
    별도의 키워드를 쓰지 않고 .java 문서에 가장 바깥쪽에 선언되는 class.


  • 내부 클래스
    클래스의 내부에서 선언하며 존재하는 클래스.
    비 정적 중첩클래스라고도 함. 정적요소(메서드, 변수) 가질 수 없음.
    - 장점 : 
    1. 내부 클래스에서 외부 클래스에 대한 접근이 쉽다. (이게 왜 장점인지 모르겠다. 이미 내부 클래스로 만들어 놨기 때문에 접근이 쉬워진것이지.. 내부 클래스로 만들어야 하는 이유가 장점아닌가..)
    2. 서로 관련된 클래스를 묶어 놓으므로써 코드 캡슐화는 증가 시킴.
    말하자면 다른 외부에서는 쓰일 필요가 없는 클래스를 굳이 밖에 정의 할 필요 없이 관련된 클래스 내부에 만들어 버리는것이다.
    3. 외부에서 내부 클래스로 접근을 막아서, 코드의 복잡성을 줄일 수 있다.




  • 익명 클래스
    선언 위치는 메서드 내부이며, 클래스의 이름이 존재하지 않는 클래스이다.
    그리고 클래스의 정의 또한 다른 클래스들 처럼 따로 정의 되어 있지 않고,
    객체 생성과 동시에 정의된다. 객체를 여러개 만들 필요가 없고 필요 순간에만 만들어 사용하기에
    충분한 경우에 생성한다.
    (익명 클래스가 왜 필요한가 생각을 해보았다. 그냥 메서드를 만들면 될 수도 있지 않나,..
    그런데 어떠한 클래스 내에 정의해야 할지 애매하거나, 자주 진입하는 구문이 아니거나, 혹은 특정 클래스의 멤버들을 사용 해야 하는 경우, 이럴 경우에 쓰지 않을까 싶다.)
    Runnable이나 Event Listener 객체를 생성하는데 주로 사용.
    - 사용 이유:
    지속적으로 사용할 객체가 아니고 자주 사용되는 객체가 아니기 때문에 필요 상황에서만 만드는것이다..
     
  • 중첩 클래스
    내부 클래스와 같이 특정 클래스 내에 정의되는 클래스이지만 static 키워드를 사용하여 만들어서 정적 클래스가 된다.
    클래스의 관리 효율을 높인다
    (내부 클래스란 보통 외부클래스 내에서만 쓰이는데, 외부 클래스가 만들어질때마다 만들어 지지 않고 하나만 만들어져 있는 정적인 상태이기에 
    - 장점 :
    1. 논리적으로 한 곳에 클래스들을 모아놓을 방법 중 하나로서 사용
    2. 캡슐화 증가
    3. 가독성 및 유지보수에 유리


  • 지역 클래스
    선언위치가 메서드 내부이다.
    선언 영역이 메서드 내부이므로 메서드 내부에서만 사용 가능하다.
    static으로 선언. (static으로 선언하지 않아도 에러가 발생하진 않는다... 그렇다면 왜 static으로 선언하는지 모르겠다.)
    지역 클래스내의 변수를 final로 생성함.
    지역 클래스를 품는 클래스 포함하여 내부의 모든 요소에 접근 가능하다.
    static이기 때문에 지역 클래스가 선언된 위치인 메서드가 종료되더라도 지역클래스의 객체는 클래스 영역에 남아 있고, 계속 자신을 포함하고 있는 메서드의 지역변수에 접근 가능하다. 그러므로 지역 클래스를 품고 있는 메서드에 정의된 변수는 final로써 지정하여야 하며, 그래서 자신을 품은 메서드가 종료 되어도 살아있는 지역 클래스가 메서드의 지역 변수에 접근 할 수 있다.


  • 추상 클래스
    1개 이상의 추상메소드를 멤버로 가지고 있는 클래스를 말한다. 추상 메서드를 가진것을 제외하면 일반 클래스와 다르지 않음.
    일반 클래스와 똑같이 멤버 변수, 멤버 메서드를 가지고 있더라도, 추상 메서드를 하나만 갖고 있으면 해당 클래스는 추상 클래스가 되고 해당 클래스를 객체를 만들어 사용할 수 없다.
    그러므로 해당 추상 클래스를 상속받은 클래스에 추상 메서드까지 구현하여야 추상 클래스를 실질적으로 사용 할 수 있다. 익명클래스처럼 메서드 내에서 추상 클래스를 상속받아 메서드를 구현하여 사용 할 수도 있다.


  • 외부 클래스
    내부 클래스를 포함하는 클래스

+ 추가적으로 인터페이스
인터페이스란 사실,
멤버 변수로는 상수(final)만을, 멤버 메서드로는 추상메서드(abstract)만 가진 추상클래스와 동일하다고 볼 수 있다. 내부에 정의된 메서드는 모두 public이 된다.

- 일반 인터페이스의 구조

public interface (인터페이스 이름) 
{
  //추상 메소드
}

- 서브 인터페이스의 구조
public interface (서브인터페이스 이름) extends (인터페이스1),(인터페이스2)
{
  //내용//
}

 


필드와 메서드

 

 

필드

클래스의 멤버 단위에 정의된 변수

 

 

변수의 종류

  • 클래스 변수
    static이 붙은 필드
    클래스로 만들어진 인스턴스 들이 공통적으로  갖는 속성을 나타내는 변수
    인스턴스 생성 없이 접근 가능
    ex : 클래스명.클래스변수명
    초기화를 하지 않아도 강제로 초기화가 이루어짐. (힙 메모리는 빈공간을 허용하지 않는다)

  •  인스턴스 변수
    static이 붙지 않은 필드.
    인스턴스 마다의 속성을 나타내기 변수
    초기화를 하지 않아도 강제로 초기화가 이루어짐. (힙 메모리는 빈공간을 허용하지 않는다)

  • 지역 변수
    클래스, 인스턴스 변수가 아닌 나머지 변수
    (메서드 내에서 선언된 변수).
    강제로 초기화 되지 않는다.

각 변수들의 생성 시점

  • 인스턴스 변수
    new를 이용하여 인스턴스 변수가 선언된 객체가 생성될때.
    자신을 품은 클래스의 객체와 함께 힙 영역에 저장됨.
    그러므로 객체가 사라지지 않는한 계속 존재함.


  • 클래스 변수
    컴파일 시점에 생성됨.
    클래스 영역에 저장되어 계속 존재함.

  • 지역변수
    메서드나, 특정 블럭 안에서 생성되는 변수. (인스턴스, 클래스 변수와는 다름)
    멤버 변수가 아닌것.
    멤버 변수와는 달리 스택 영역에 저장됨. (멤버 변수는 힙영역)
    한 동안 사용하지 않는 동안 가상머신에 의해 삭제 됨.

 

기타

  • static 키워드
    클래스의 멤버들에게 붙을 수 있는 키워드
    (멤버 변수, 멤버 메소드, 이너클래스)
    static이 붙으면 정적멤버라고 부른다

  • 참조
    참조하려면 메모리에 어딘가에 인스턴스가 있어야함.


  • 메서드
    클래스의 기능을 담당하는 역할.
    특정한 기능을 위한 코드의 집합.

 

  • 메서드 오버로딩
    클래스내에서 같은 이름으로 여러개의 메서드를 만드는것. 다만 매개변수 타입,  매개변수 갯수 와 같은 것중 다른것이 존재하여야 한다.
    반환타입은 오버로딩의 조건에 해당되지 않는다!!!!


  • 오버로드의 조건
    1. 메소드명칭 동일
    2. 매개변수의 타입 혹은 갯수가 달라야한다.


  • JAVA에서의 Call By Value, Call By Reference
    자바는 메서드로 참조 변수를 넘길때 참조 변수가 가지고 있는 주소값 자체를 복사하여 넘긴다.
    그러므로 Call By Value 이면서, 효과는 Call By Reference를 보여 준다.
    참조변수를 매개변수로 받은 메서드 내에서 원본값 수정이 가능하다.

 

 

 

 





참조 : https://seokbeomkim.github.io/posts/java-inner-class/

 

자바의 중첩 클래스(Nested Class)

일상 속 글쓰기

seokbeomKim.github.io

http://wiki.hash.kr/index.php/%ED%81%B4%EB%9E%98%EC%8A%A4 

 

클래스 - 해시넷

클래스(class)란 객체 지향 프로그래밍(OOP)에서 새로운 객체(object)를 만들기 위한 템플릿을 말한다. 클래스를 사용하여 인스턴스(instance)를 생성함으로써 객체를 만들 수 있다. 파일 확장자는 .class

wiki.hash.kr

https://developer-yeony.tistory.com/134