TIL / JAVA 1주차(3) / 객체지향언어 / 클래스멤버 / 오버로딩

병아리코더 아카이브·2023년 8월 17일

JAVA

목록 보기
3/20
post-thumbnail

객체 지향 언어 ( OOP )

80년 초 소프트웨어의 위기(빠른 변화를 못쫓아감)에 의해 해결책으로 절차지향에서 객체지향 언어를 도입하였다.

OOP( Object Oriented Programming ) 는 프로그래밍 언어 + 객체지향개념(규칙) 으로,

  1. 코드의 재사용성을 높이고
  2. 유지보수가 용이하며
  3. 중복 코드를 제거할 수 있는 기능들이 많이 있다.

남의 부품 ( code ) 를 편하게 가져다 사용하기 위한 것이라고 이해하면 쉽다.

객체지향언어의 특징

  1. 캡슐화
  2. 상속
  3. 추상화
  4. 다형성

CLASS

남의 부품 ( code ) 를 가져다 쓸 때 어떻게 써야 편하게 쓸까??
: 분류 ( Classification ) 를 잘 해야 한다.

  • Classification ( 분류 체계 ) 의 약자.

  • 다른 부품을 잘 사용하기 위해서는 분류가 필요하기 때문에 Class 와, Class 의 종류별 묶음인 Pakage 분류 체계가 존재한다.

  • Class 안에는 각종 메서드변수(필드) 등을 담기 때문에 class 의 이름은 이러한 변수와 메서드를 대변하는 이름이어야 한다.

  • Class 는 자료형이 될 수 있다. ( 참조형 타입으로 사용 OK )

CLASS 선언

  • 하나의 파일에 한 개 이상의 클래스 ( 1개만 쓰는 것이 바람직하다 )
    만약 여러 클래스를 한 파일 안에 써야 할 상황이면 그 중 public class 는 1개만 사용 가능하다.

  • 파일명과 클래스명이 정확히 일치해야 한다.
    1) 만약 public class 가 하나도 없으면 나머지 class 이름 들 중 어느 이름도 가능하다
    2) 만약 public class 가 아니더라도 main 메서드를 가진 class 이름과 파일의 이름이 일치해야 한다.

  • 앞글자는 대문자로 표시해야 한다. ( 파스칼 표기법 )

  • 앞글자에 특수문자나 숫자는 금지한다.

JAVA 에서 사용되는 표기법 ( 혼용해서 사용 OK )
1. 파스칼 표기법 : 모든 단어에 첫 글자는 대문자이며 나머지는 소문자 ( Blackcolor )
2. 카멜 표기법 : 최초의 사용되는 단어 외에는 의미를 갖는 단어의 첫글자를 대문자로 ( blackColor )

main 메서드

Class 안에서 스스로 동작 및 실행이 가능한 메서드.
Class 안에 main 메서드가 없으면 그 Class는 스스로 동작 할 수 없다.
그래서 누군가가 그 Class 를 사용해주어야 한다.
( 이때 main 메서드가 있는 클래스는 Main 으로 지어주면 좋다. )


CLASS MEMBER

  • 클래스 안에 있는 모든 것멤버라고 부른다
    클래스에 접근하면 그 클래스의 멤버를 사용할 수 있다.

MEMBER의 종류

  • 멤버변수(필드) : 클래스 안의 변수 ( 필드 )를 칭한다.
  • 생성자 :
    객체화 시 복사본(객체)을 만들기 위해 가장 먼저 호출하는 메서드.
    특별한 경우가 아니면 당연히 존재하는 거라 생략해도 OK
    생략해도 new 생성자(); 로 객체 생성이 가능하다.
  • Method : 변수가 어떤 사물의 속성을 의미하면 메서드는 사물의 기능을 의미한다.

멤버 변수 ( 필드 )

클래스의 필드(field)란 클래스에 포함된 변수(variable)를 의미한다.

변수의 종류

  1. 인스턴스 변수 : 클래스 영역에서 선언한다. 객체가 생성됬을 때 생성된다.
  2. 클래스 변수 : 클래스 영역에서 선언한다. 클래스가 메모리에 올라갈 때 생성된다. Static 키워드를 붙인다.
  3. 지역 변수 : 메서드 영역에서 선언한다. 메서드 수행이 시작될 때부터 끝날 때까지 유효하다.
  4. 매개 변수 : 메서드 영역에서 선언한다. 메서드 수행이 시작될 때부터 끝날 때까지 유효하다.

클래스 변수와 인스턴스 변수는 초기화를 하지 않아도 변수의 타입에 맞게 자동으로 초기화 된다. (ex) int lv;
하지만 지역변수는 꼭 초기화해줘야 한다. (ex) int lv = 0;

인스턴스 변수

  • 인스턴스 변수는 객체마다 가져야 하는 개별 값을 유지하기 위해 사용한다. 그래서 속성의 개별 영역 에 주로 쓰인다.
  • 인스턴스 변수는 클래스 영역에서 선언한다.
  • 객체가 생성될 때 생성되어 Heap 영역에 저장 된다.

클래스 변수 ( Static 변수 )

  • 클래스 변수는 객체를 공유하는 변수로 여러 객체에서 공통으로 사용하고 싶을 때 사용한다.
  • 클래스 변수는 클래스 영역 에서 선언한다.
  • 클래스가 메모리에 올라갈 때 생성 되어 정적 영역(Method 영역)에 저장 된다.

인스턴스 변수와 클래스 변수의 호출

  • 인스턴스 변수 : 객체 생성 후 참조변수 c 를 이용하여 인스턴스 변수를 불러온다.
  • 클래스 변수 : 객체 생성 필요 없이 Card 클래스를 이용하여 클래스 변수를 불러온다.

클래스 변수도 참조변수 c 를 사용할 수는 있다. 하지만 이렇게 사용 시에는 객체를 통해 클래스에 접근하는 것이기 때문에 좋은 방식이 아니므로 사용 X


1. 같은 클래스 내에서 static 멤버끼리 Inner.st_msg(); 가 아닌 st_msg() 와 같이 호출이 가능하다.
2. 마찬가지로 인스턴스 멤버끼리는 Inner inner = new Inner(); 객체 생성할 필요 없이 h_msg() 로 호출이 가능하다.
(같은 Heap 영역에 있기 때문에 가능하다)
3. 하지만 static 멤버에 인스턴스 멤버를 호출 시에는 영역이 다르기 때문에 따로 객체를 생성해줘야 하고, 반대도 마찬가지로 클래스명을 명시해줘야 한다.
( 클래스명을 안써도 허용을 해주긴 하나 객체를 통해 클래스에 접근하는 거라 좋은 방식이 아니므로 사용 X )


객체 ( Instance )

  • 실제로 존재하는 사물 또는 개념을 뜻한다.

  • 클래스를 인스턴스(객체)로 만드는 것을 인스턴스화(객체화) 라고 한다.
    여기서 인스턴스화는 사용할 클래스를 복사하여 변수에 넣는 행위를 말한다.

클래스 : 원본
객체 : 복사본
원본을 그대로 가져다 사용하면 훼손되기 쉽기 때문에 복사본을 사용하는 것이 객체화이다.

  • 복사된 객체는 변수에 담길 수 있다.
    이때 변수의 데이터 타입은 객체의 원본 클래스이다.
    Tv tv = new Tv();

  • Tv tv1 = new Tv();
    Tv tv2 = new Tv();
    를 만들었을 때 tv1tv2 는 원본이 아닌 복사본이기 때문에 서로 다른 객체이다.

생성자 호출

객체화를 할 때 복사본을 만들기 위해 생성자를 호출 한다.


생성자 ( Constructor )

  • 객체화를 할 때 복사본을 만들기 위해 생성자를 호출 한다.

  • 생성자는 객체화 시에 가장 먼저 실행되고, 초기화 하는 수단으로 활용 된다.

  • 초기화는 생성시 최초로 어떤 값을 입력하는 것을 의미한다.
    ( 모든 걸 0 으로 하는 것이 아님 )

  • 생성자는 class 를 객체화 해준다.
    객체화 요청 -> 생성자 호출 -> 객체화 과정 을 거친다.

  • 생성자는 오버로딩(overroading) 이 가능하다.

생성자 생성 규칙

  • 생성자의 이름과 클래스의 이름은 같아야 한다.
  • return 값이 없지만 void 를 붙이진 않는다.
    (너무 당연해서)
  • 모든 클래스는 반드시 생성자를 가져야 한다.

생성자 매개변수

매개변수가 없는 생성자 ( 기본 생성자 )

public class Dog {
	public Dog() { ... }
}```

매개변수(Parameter) 이 없는 생성자.
생성자가 하나도 없으면 컴파일러가 자동으로 생성자를 추가시켜줘서 생성자 없이도 new 생성자(); 로 객체 생성이 가능했다.

매개변수가 있는 생성자

매개변수(Parameter) 이 존재하는 생성자.
매개변수와 초기화할 변수명이 같으면 this 로 구분지어준다.


객체 생성 후 변수를 사용하여 초기화 하는 방법
생성자를 통해 초기화를 하는 방법 두가지 모두 결과는 동일하다.


오버로딩 ( overroading )

과적을 의미한다.
원래는 한 클래스에는 하나의 생성자만 가능하다. 그러다 보니 초기화 할 때 여러 경우를 만들면 그 경우마다 클래스를 만들고 그 많은 클래스를 알아야 하는 번거로움이 생긴다.
그래서 오버로딩 ( overloading ) 이라는 기능을 만들었다.

생성자 오버로딩

같은 이름으로 여러개의 생성자를 만드는 것.
다만 매개변수의 갯수타입은 달라야 한다.

앞서 본 이미지의 Car() 생성자가 같은 이름으로 2개 있는 것이 오버로딩이다.
이 때 매개변수와 초기화할 인스턴스 변수명이 동일하면 this 로 구분해준다.
( 다르면 구분할 필요가 없어 this 사용하지 않아도 된다.)

메서드 오버로딩

한 클래스 안에 같은 이름의 메서드를 여러개 정의하는 것.

(ex) System.out.println() 가 대표적인 오버로딩한 메서드이다.

오버로딩을 사용하지 않았을 경우 더하는 매개변수 마다 각각 다른 이름의 메서드를 사용해야 하기 때문에 사용자 입장에서 불편하다.
오버로딩 사용 시 하나의 이름으로 여러 매개변수를 넣으면 알아서 맞는 타입의 메서드로 연결 되어 편리하다.

오버로딩된 메서드의 기능은 결과적으로 동일한 기능을 구현해야 한다.

메서드 오버로딩 성립조건

  1. 메서드 이름은 동일
  2. 매개변수 개수, 타입은 달라야 함
  3. 반환타입은 영향 없음

오버로딩과 오버라이딩

  • 오버라이딩 : 부모로부터 물려받은 메서드를 새롭게 덮어 사용하는 것
  • 오버로딩 : 한 클래스 안에 같은 이름의 메서드 여러 개 정의하는 것

0개의 댓글