[JAVA] OOP 1 - 기초

zirryo·2022년 7월 11일
0

⚡️ STUDY

목록 보기
5/15
post-thumbnail
week 3 / 22.07.07

Intro

  • OOP(Object Oriented Programming)
    • 프로그래밍에서 필요한 데이터를 모아 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 특정 기능을 구성하는 방법
    • 사물의 속성(state)과 기능(behavior)을 분석한 후에 이것을 프로그래밍의 변수와 함수로 정의


Class / Object

💿 클래스

  • 클래스로 객체를 생성할 수 있고, 객체는 클래스에 정의된 대로 생성됨.
  • 클래스는 객체 그 자체가 아닌, 객체를 생성하는 틀 혹은 설계도.
  • 클래스명은 대문자로 시작하는 것이 관례.
  • 인스턴스 : 클래스를 통해 생성된 객체

  • 클래스의 4가지 구성요소
    (생성자를 제외한 나머지 3요소를 멤버(member)라고 함.)
    • 필드(field) : 클래스의 속성을 나타내는 변수
    • 메서드(method) : 클래스의 기능을 나타내는 함수
    • 생성자(constructor) : 클래스의 객체를 생성
    • 이너클래스(inner class) : 클래스 내부의 클래스
      public class ExClass {     // class 클래스명
      	int num = 3;           // (1) 필드
      	void learn() {...}     // (2) 메서드
      	ExClass {...}          // (3) 생성자
      	class ExClass2 {...}   // (4) 이너 클래스
      } 



💿 객체

  • new 키워드를 이용하여 실제 객체를 생성하여 클래스 멤버에 접근 가능.
  • 참조 변수는 실제 데이터 값 X, 데이터가 저장되어 있는 힙 메모리 주소값이 저장됨.
    클래스명 참조변수명 = new 생성자();
    // 객체 생성 예시
    Person p = new Person();
    // Person 클래스로 만들어진 p 인스턴스
  • 클래스는 클래스 영역에, 참조 변수는 스택 영역에 저장됨.
  • 생성자로 만들어진 인스턴스는 힙 메모리 영역에 저장되며, 객체 내부에는 클래스의 멤버들이 위치함.
  • 같은 클래스로 만든 동일한 객체는 동일한 메서드 값을 공유하므로 한번만 저장해두고 필요한 경우에만 클래스 영역에서 불러와서 사용함.

  • 객체의 활용
    . 을 활용하여 특정 인스턴스 객체의 필드와 메서드, 즉 객체의 멤버들에 접근할 수 있음.
    // 객체의 멤버에 접근하기.java
    참조 변수명.필드명 // 필드값 불러오기
    참조 변수명.메서드명() // 메서드 호출




Field / Method

📀 필드

클래스에 포함된 변수, 객체의 속성을 정의할 때 사용.

  • 클래스 변수(cv, class variable)
    • static키워드를 통해 선언하는 변수. 공통된 저장공간을 공유함.
    • 한 클래스로부터 생성되는 모든 인스턴스들이 특정한 값을 공유하는 경우에 사용함.
    • 인스턴스 변수와 달리 인스턴스를 따로 생성하지 않고도 언제라도 클래스명.클래스변수명 을 통해 사용이 가능
  • 인스턴스 변수(iv, instance variable)
    • 인스턴스가 가지는 고유한 속성을 저장하는 변수, new 생성자()를 통해 인스턴스가 생성되면서 같이 생성됨.
    • 힙 메모리의 독립적인 공간에 저장, 객체별 고유의 개별성을 지님.
  • 지역 변수(lv, local variable)
    • 메서드 내의 {}블록 안에서만 사용 가능한 변수.
    • 위의 두 멤버 변수와는 다르게 스택 메모리에 저장되어 메서드가 종료되는 것과 동시에 함께 소멸.
    • 직접 초기화 하지 않으면 값 출력시 오류 발생하므로 반드시 초기화.
      class Example { // => 클래스 영역
      	int instanceVariable; // 인스턴스 변수
      	static int classVariable; 
          // 클래스 변수(static 변수, 공유변수)
      ⠀⠀⠀⠀⠀
      	void method() { // => 메서드 영역
      		int localVariable = 0; 
              // 지역 변수. {}블록 안에서만 유효
      	}
      }
      // `field`에 포함되는 변수는 클래스 변수와 인스턴스 변수이다.
      // 그 중 `static`키워드를 포함하면 클래스, 그렇지 않으면 인스턴스 변수이다.
      // 필드를 제외한 메서드 내에 포함되는 모든 변수는 지역변수.

  • Static
    : 클래스의 멤버(필드, 메서드, 이너클래스)에 사용 가능.
    • static이 붙어있으면 정적 멤버(static member)라고 함.
    • 정적 멤버는 클래스 내부에 저장공간을 가지고 있기 때문에 객체 생성없이 바로 사용 가능.
    • 정적 필드 : 객체간 공유 변수의 성질을 가짐. 메서드에도 동일하게 적용됨.
    • 정적 메서드 : 정적 메서드는 인스턴스 생성 없이 호출이 가능하기 때문에 인스턴스 변수 or 인스턴스 메서드 사용 불가능.
      public class Test {
          public static void main(String[] args) {
              StField stField1 = new StField(); // 객체1 생성
              StField stField2 = new StField(); // 객체2 생성
      
              stField1.num1 = 60; 
              stField2.num1 = 90;
      
              System.out.println(stField1.num1); // 60
              System.out.println(stField2.num1); // 90
      
              stField1.num2 = 150;
              stField2.num2 = 250;
              System.out.println(stField1.num2); // 250
              System.out.println(stField2.num2); // 250
          }
      }
      
      class StField {
          int num1 = 30;         // 인스턴스 변수
          static int num2 = 50;  // 클래스 변수
      }




📀 메서드

특정 작업을 수행하는 일련의 명령문들의 집합. 클래스의 기능

  • 메서드의 구조
    • 메서드 시그니처 : 자바 제어자 / 반환타입 / 메서드명 / 매개변수 로 구성됨.
    • 메서드 바디 : {} 안에 해당 메서드가 호출되었을 때 수행하야 하는 일련의 작업을 표시. 관례적으로 메서드명은 소문자로 표현.
    • void : 메서드의 반환타입. void 키워드가 없는 경우 반드시 메서드 바디에 return 문이 존재. 결과값은 반드시 반환타입과 일치하거나 자동변환 가능한 타입이어야 함.
      자바제어자 반환타입 메서드명(매개 변수) {  // 메서드 시그니처
      	메서드 내용     // 메서드 바디
      }
      void printMethod() {                 // 반환타입이 void인 메서드
      	System.out.println("this is method");
      }
      int getNum() {                       // 매개변수가 없는 메서드
      	return 10;
      }
      double multiply(int x, double y) {   // 매개변수가 있는 메서드
      	double result = x * y;
      	return result;
      }
  • 메서드의 호출
    • 각각의 리턴 타입에 맞는 결과값을 반환함.
    • 메서드 호출 시 괄호 안의 입력값을 인자(Argument)라고 하며,
      개수와 순서는 반드시 메서드 정의할 때 선언된 매개변수와 일치해야 함.
    • 인자의 타입은 매개변수의 타입과 일치하거나 자동 형변환이 가능해야 함.
      메서드이름(매개변수1, 매개변수2, ...); // 메서드 호출방법void printMethod();       // this is method
      int getNum();             // 10
      double multiply(3, 2.5);  // 7.5
  • 메서드 오버로딩(Method Overloading)
    : 하나의 클래스 내부에 같은 메서드명을 가진 메서드를 여러 개 정의하는 것.
    : 하나의 메서드로 여러 경우의 수를 해결할 수 있다는 장점을 가짐.


    다음의 2가지 조건을 모두 만족해야 함.
    1. 같은 이름의 메서드명 을 사용해야 한다.
    2. 매개변수의 개수 or 타입이 다르게 정의되어야 한다.
      public class Overloading {
          public static void main(String[] args) {
              Math m = new Math(); // 객체 생성
              m.calculate(); // 메서드 호출
              m.calculate(5);
              m.calculate(4,3);
              m.calculate(7.5, 1.5);
          }
      }
      
      class Math {
          public void calculate() { // 메서드 오버로딩
              System.out.println("계산");
          }
          public void calculate(int x) {
              System.out.println("입력 = " x);
          }
      	public void calculate(int x, int y) {
              System.out.println("더하기 = " x + y);
          }
      	public void calculate(double x, double y) {
              System.out.println("나누기 = " x / y);
          }
      }




Constructor

💿 생성자

인스턴스 변수들을 초기화하기 위해 사용하는 특수한 메서드
인스턴스를 생성하는 것은 new 키워드.

  • 생성자의 3가지 특징
  1. 생성자의 이름은 반드시 클래스명과 같아야 함.
  2. 생성자는 별도의 리턴 타입 없음.
  3. 생성자 오버로딩이 가능함.

  • 생성자의 구조
    클래스명(매개변수) { // 생성자 기본 구조, 매개변수는 없을 수도 있음.
    	......
    }
  • 생성자 오버로딩 예시 코드
    public class ConstructorEx {
        public static void main(String[] args) {
            Con con1 = new Con();
            Con con2 = new Con("second");
            Con con3 = new Con(3,2);
        }
    }
    
    class Con {
        Con() { // (1) 생성자 오버로딩
            System.out.println("생성자1");
        }
    
        Con(String str) { // (2) 
            System.out.println("생성자2");
        }
    
        Con(int a, int b) { // (3) 
            System.out.println("생성자3");
        }
    }
  • 기본 생성자(Default Constructor)
    • 모든 생성자는 반드시 하나 이상의 생성자 존재해야 함.
    • 생성자가 클래스 안에 포함되어 있지 않은 경우는 컴파일러가 자동으로 생성.
    • 생성자가 이미 추가되어 있는 경우는 해당 생성자를 기본 생성자로 사용.

  • 매개변수가 있는 생성자
    • 메서드의 경우처럼 매개변수를 통해 호출 시 인스턴스 생성과 동시에 해당 값을 이용하여 초기화.
    • 고유한 특성을 가진 인스턴스를 계속 만들어야 하는 경우 인스턴스마다 다른 값으로 초기화 가능.
      public class VarCon {
         public static void main(String[] args) {
             Book b = new Book("Clean code", "공학서적", 584);
             System.out.println("이 책은 " + b.bookName() + ", 페이지 수는 " +  b.pages + "입니다.");
         }
      }
      
      class Book {
         private String bookName;
         private String bookField;
         int pages;
      
         public Book(String bookName, String bookField, int pages) {
             this.bookName = bookName;
             this.bookFiled = bookField;
             this.pages = pages;
         }
      
         public String bookName() {
             return bookName;
         }
      }



💿 this / this()

this

  • 인스턴스 변수와 매개변수를 이름으로 구분하기 위해 사용하는 키워드
  • 인스턴스 자신을 나타내며, this를 이용하여 인스턴스 자신의 변수에 접근.
    this.bookName = bookName; // this 키워드를 사용하여 구분
     bookname = bookname; // 둘 다 지역변수로 간주

this()

  • 자신이 속한 클래스에서 다른 생성자를 호출하는 경우에 사용하는 메서드
    아래의 두 가지 문법요소를 모두 만족해야 함.
    1. this()는 생성자의 내부에서만 사용 가능.
    2. this()는 반드시 생성자의 첫 줄에 위치.
  • this() 예시 코드
    public class TestThis {
        public static void main(String[] args) {
            This example = new This();
            This example2 = new This(1);
        }
    }class This {
        public This() {
            System.out.println("기본 생성자");
        };public This(int x) {
            this();  // "기본 생성자"
            System.out.println("매개변수가 있는 생성자");
        }
    }
    
    // 출력
    기본 생성자
    기본 생성자
    매개변수가 있는 생성자




Inner Class

📀 내부클래스 개요

클래스 내부에 선언된 클래스

  • 외부 클래스와 내부 클래스가 서로 연관되어 있을 때 사용함.
  • 외부 클래스의 멤버들에 쉽게 접근 가능, 코드의 복잡성 낮춤.
  • 캡술화 달성하는 데 유용함.
    class Outer { // 외부 클래스
    
    	class Inner {
    		// (1) 인스턴스 내부 클래스	
    	}
    	static class StaticInner {
    		// (2) 정적 내부 클래스
    	}
    	void run() {
    		class LocalInner {
    		// (3) 지역 내부 클래스
    		}
    	}
    } 

  1. 인스턴스 내부 클래스

    선언 위치사용 가능한 변수
    외부 클래스의 멤버변수 위치에 선언외부 인스턴스 변수, 외부 전역 변수
  2. 정적 내부 클래스

    선언 위치사용 가능한 변수
    외부 클래스의 멤버변수 위치에 선언외부 전역 변수
  3. 지역 내부 클래스

    선언 위치사용 가능한 변수
    외부 클래스의 메서드 혹은 초기화 블럭 내부외부 인스턴스 변수, 외부 전역 변수
  4. 익명 내부 클래스

    선언 위치사용 가능한 변수
    클래스의 선언과 객체의 생성 동시에 진행. 일회용외부 인스턴스 변수, 외부 전역 변수



📀 멤버 내부 클래스

인스턴스 내부 클래스

  • 객체 내부에 멤버의 형태로 존재.
  • 외부 클래스의 모든 접근 지정자의 멤버에 접근 가능. (private도 접근 가능)
  • 반드시 외부 클래스 생성한 이후에 사용 가능.
  • 즉, 정적 변수나 정적 메서드는 인스턴스 내부 클래스에서 선언 불가.

정적 내부 클래스

  • 객체 내부에 멤버의 형태로 존재.
  • static 키워드 사용함.
  • 외부 클래스의 존재와 무관하게 정적 변수 사용 가능.



📀 지역 내부 클래스

  • 클래스의 멤버가 아닌 메서드 내에서 정의되는 클래스.
  • 클래스 내부에서만 사용가능하기 때문에, 일반적으로 메서드 안에서 선언 후 바로 객체를 생성하여 사용.
    class Outer { //외부 클래스
        int num1 = 10;
        void printNum() {
            int num2 = 20;
            class LocalInClass { //지역 내부 클래스
                void getPrint() {
                    System.out.println(num1);
                    System.out.println(num2);
                }
            }
            LocalInClass localInClass = new LocalInClass();
            localInClass.getPrint();
        }
    }
    public class Main {
        public static void main(String[] args) {
            Outer o = new Outer();
            o.printNum();
        }
    }
    
     // 출력
     10
     20

0개의 댓글