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

·2022년 9월 2일
0

Java

목록 보기
1/14
post-thumbnail

클래스와 객체, 필드와 메서드

객체지향이란?

  • 실제 세계를 모델링하여 소프트웨어를 개발하는 방식.
    객체의 고유한 속성인 변수와 함수인 메소드를 가진다.

객체지향 언어의 장점

  1. 코드의 재사용성이 높다.
  2. 유지보수가 용이하다.
  3. 중복된 코드 제거 기능을 가진다.

객체지향 4대 핵심 개념

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

💡 객체지향 언어 = 프로그래밍 언어 + 객체지향의 개념 및 규칙

클래스와 객체

클래스

클래스란?

  • 객체를 정의해 놓은 것!
  • 객체를 제품이라고 한다면 클래스는 제품 설계도라 볼 수 있다.

    💡 제품을 생성하기 위한 데이터(변수, 메서드(함수))를 가지는 전체적인 틀

클래스의 문법

class 클래스명 {
 	변수와 메서드 정의
 }
  • 클래스는 4가지 요소로 구성되어 있다.
  1. 필드 : 클래스의 속성을 나타내는 변수
  2. 메서드 : 클래스의 기능을 나타내는 메서드
  3. 생성자 : 클래스의 객체를 생성하는 역할
  4. 이너클래스 : 클래스 내부의 클래스
 public class Example {
 	int a = 10;           // 필드
    void printX() {...}   // 메서드
    Example {...}         // 생성자
    class Example2 {...}  // 이너 클래스

💡 클래스의 멤버 : 필드(속성, 변수)과 메서드

클래스의 이름

  • 일반적으로 하나의 소스파일(.java)에는 하나의 클래스만 정의하는 것이 바람직하지만 여러개의 클래스를 정의할 경우 주의할 점들이 있다.

    ❔ 한가지 궁금
    위 예시에는 public 클래스가 2개 이상 올 수 없다고 했으나 학습자료 예시에는 public 클래스 내부에 다른 public 클래스가 있음. 실행도 됨. 내부에 있는건 상관이 없는걸까?

객체

객체란?

  • 클래스를 통해 생성된 것
  • 속성(변수)와 기능(메서드)로 이루어져 있다.

    💡 인스턴스화
    인스턴스는 객체와 같은 의미이지만 객체보다 작은 개념이다.
    A라는 클래스를 사용해 객체를 생성하는 것을 '인스턴스화'라고 하며 인스턴스화를 통해 생성된 객체를 'A 인스턴스'라고 하는 것이 일반적이다.

객체의 생성 및 활용

  • 인스턴스화 방법
클래스명 변수명 = new 생성자(); // 클래스명의 인스턴스를 생성
                            // 생성자는 클래스명과 이름이 같아야함.

💡 new 연산자는 객체(인스턴스)를 만들어진 객체에 주소를 알려주는 역할을 한다.
대입연산자(=)는 생성된 객체를 주소와 연결해주는 역할을 한다.

class Tv {
	int channel;                      // Tv클래스의 변수 선언
   
   void channelUp() { --channel;}    // Tv클래스의 메서드 선언

위 예시코드에서 클래스 Tv의 인스턴스를 생성해보자.

Tv t;          // 1번 과정. 
t = new Tv();  // 2번 과정. 
  • 1번 과정 : Tv클래스 타입의 참조변수t를 선언
    참조변수t의 저장공간이 메모리에 생성된다.

  • 2번 과정 : 연산자 new에 의해 Tv클래스의 인스턴스가 메모리의 빈 공간에 생성
    즉, 참조변수t에 새로 생성된 인스턴스의 주소를 저장.

💡 객체 속성의 값은 기본적으로 초기화 되어있어 0, null, false값이 저장되어 있다.
속성의 값을 넣어주려면 참조변수.변수명으로 넣어줄 수 있음. (예, t.channel = 7;)

필드와 메서드

필드

필드란?

  • 클래스에 포함된 변수
  • 멤버변수, 객체변수라도 한다.
  • 변수의 종류로는 클래스변수, 인스턴스변수, 지역변수로 나눌 수 있다.

클래스, 인스턴스, 지역 변수

class variables {  // 클래스영역 시작
  int iv;          // 인스턴스 변수
  static int cv;   // 클래스 변수(static+iv)
  
  void method() {  // 메서드영역 시작
     int lv = 0;   // 지역 변수
   }               // 메서드영역 끝
}                  // 클래스영역 끝

💡 클래스 변수 -> 모든 인스턴스가 공통된 저장공간을 공유
인스턴스 변수 -> 인스턴스가 생성될 때, 독립적인 저장공간을 갖는다.
💡 클래스는 자동으로 생성되기 때문에 인스턴스화를 하지 않아도 사용이 가능하다.
사용예시 : (클래스명이 A라면) A.클래스변수명
💡 클래스 변수는 static + iv 라고 볼 수 있다.

  • 지역변수는 해당 메서드 내에서만 사용할 수 있다.
  • 인스턴스 변수 -> 힙 메모리 영역에 저장
    지역변수 -> 스택메모리 영역에 저장
    따라서, 인스턴스 변수는 객체가 없어지지 않는 한 절대 삭제되지 않는 반면에 스택 메모리에 저장된 지역변수는 사용되지 않는 경우 삭제된다.

    💡 인스턴스 내의 메서드는 힙 메모리에 올라가 클래스 영역과 공유한다. -> 재사용성

지역변수의 특징

  1. 메서드 안에서만 존재
  2. 메서드 종료 시 삭제
  3. 변수 초기화 강제 -> 왜? 에러를 발생시키지 않기 위해

메서드

메서드란?

  • 특정 작업을 수행하는 일련의 문장들(명령문)의 집합
  • 메서드 바디 안에는 반드시 'return 문'이 있어야 한다.
자바제어자 반환타입 메서드명(매개 변수) { // 메서드 시그니처
	메서드 내용                       // 메서드 바디
}

public static int add(int x, int y) { // 메서드 시그니처
	int result = x + y;               // 메서드 바디
	return result;
}

💡 메서드 반환타입이 void일 경우 return문은 생략된다.

메서드 사용의 장점

  1. 코드의 중복을 줄일 수 있다.
  2. 코드의 관리가 쉽다.
  3. 코드의 재사용성이 높다.
  4. 코드가 간결해서 이해하기가 쉽다.

메서드 호출

메서드 이름(매개변수1, 매개변수2, ...); //매개변수의 개수는 메서드에 따라 다름.

public static int add(int x, int y) { // 메서드 시그니처
	int result = x + y;               // 메서드 바디
	return result;
}

add 메서드를 호출하는 방법

add(1, 3);
출력값 : 4

static 메서드

메서드 앞에 static이 있으면 static메서드, 없으면 인스턴스 메서드라고 한다.

  • 인스턴스 메서드
  1. 인스턴스 생성 후,'참조변수.메서드이름();'로 호출
  2. 인스턴스 멤버(iv, im)와 관련된 작업을 하는 메서드
  3. 메서드 내에서 인스턴스 변수 사용 가능
  • static 메서드
  1. 객체생성 없이 '클래스이름.메서드이름();'로 호출
  2. 인스턴스 멤버와 관련 없는 작업을 하는 메서드
  3. 메서드 내에서 인스턴스 변수 사용 불가
    (인스턴스 변수는 객체(iv의 묶음)을 생성해야 사용이 가능하므로)

    💡 Static메서드는 인스턴스 메서드 호출이 불가능하다.
    왜? 인스턴스 메서드는 인스턴스를 생성 후 사용할 수 있고 static메서드는 항상 사용이 가능하다. 따라서 인스턴스 생성 전에는 인스턴스 멤버들이 없기 때문에 static메서드에서 인스턴스 멤버 사용이 불가능하다.

class MyMath {
      long a, b; //iv

      long add() {  
            return a+b;
      }  //인스턴스 메서드

     static long add(long a, long b) {
           return a+b;
     } //static메서드
}

class MyMathTest {
   public static void main(String args[]) {
          System.out.println(MyMath.add(200, 100); //static 메서드 호출 
   
          MyMath mm = new MyMath(); //인스턴스 생성
          mm.a = 200;
          mm.b = 100;
          System.out.println(mm.add()); //인스턴스 메서드 호출
  • static을 붙이는 경우
  1. 속성(멤버변수) 중에서 공통 속성에 붙인다 -> 클래스변수
  2. 인스턴스 멤버를 사용하지 않는 메서드에 붙인다.

메서드 오버로딩

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

  • 오버로딩이 성립하기 위한 조건
  1. 메서드 이름이 같아야 한다.
  2. 매개변수의 개수 또는 타입이 달라야 한다.
  3. 반환타입은 상관없음.
int add(int a, int b) { return a+b;}
int add(int x, int y) { return x+y;} 
오버로딩 아님. (매개변수의 타입이 같음) //메서드 중복 정의 에러

int add(int a, int b) { return a+b;}
long add(int a, int b) { return (long)(a+b);}
오버로딩 아님. (반환 타입이 다르나 그 것은 오버로딩 성립에 영향을 미치지 않음
매개변수의 타입이 같으므로 아님) //메서드 중복 정의 에러

long add(int a, long b) { return a+b; }
long add(long a, int b) { retunr a+b; }
메서드 이름이 같고 매개 변수의 타입이 다르기 때문에 오버로딩이 맞음.
profile
🧑‍💻백엔드 개발자, 조금씩 꾸준하게

0개의 댓글