본문 바로가기
혼자 공부하는 자바

혼자 공부하는 자바 (27강 ~ 33강)

by moca7 2024. 5. 28.

27강. 객체지향 프로그래밍

28강. 자바 필드

29강. 자바 생성자(1) 기본 생성자, 생성자 선언, 필드 초기화

30강. 자바 생성자(2) 생성자 오버로딩, 다른 생성자 호출 : this()

31강. 자바 메서드(1) 메서드 선언

32강. 자바 메서드(2) 메서드 선언, return문

33강. 자바 메서드(3) 메서드 호출, 메서드 오버로딩

 

 

 

 

 

27강. 객체지향 프로그래밍

 

 

객체(Object)

- 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지며 식별 가능한 것.

- 속성(필드)동작(method)으로 구성.

 

- 현실 세계의 객체를 SW인 자바로 설계하는 것을 객체 모델링이라고 함.

 

- 객체 모델링(Object Modeling)은 소프트웨어 개발 과정에서 현실 세계의 개체와 그들 간의 관계를 추상화하여 소프트웨어 시스템의 구조를 설계하는 방법론입니다. 이 과정에서 개체는 객체(Object)로 표현되고, 이 객체들은 데이터동작을 포함합니다.

 

 

객체와 객체 간의 상호작용

- 메서드를 통해 객체들이 상호작용.

- 메서드 호출: 객체가 다른 객체의 기능을 이용하는 것.

 

 

ㅁ 객체 간의 관계

- 집합 관계: 부품과 완성품의 관계

- 사용 관계: 객체 간의 상호작용

- 상속 관계: 상위(부모) 객체를 기반으로 하위(자식) 객체를 생성

 

 

객체 지향 프로그래밍

- 집합/사용 관계에 있는 객체를 하나씩 설계한 후 조립하여 프로그램 개발

 

- 객체 지향 프로그래밍(Object-Oriented Programming, OOP)은 소프트웨어 개발 패러다임 중 하나로, 프로그램을 객체(Objects)들의 상호작용으로 구성하는 방식입니다. 객체는 데이터(속성)와 해당 데이터에 작용하는 동작(메서드)을 포함합니다.

 

 

ㅁ 클래스(class)

- 자바에서 설계도를 말함.

- 인스턴스(Instance): 클래스로부터 만들어진 객체

- 인스턴스화: 클래스로부터 객체를 만드는 과정

- 객체지향 프로그래밍 단계: 클래스 설계 -> 설계된 클래스로 사용할 객체 생성 -> 객체 이용

 

 

 ㅁ 클래스 선언

 

(1) 객체 구상 후 클래스 이름을 결정

 

※ 식별자 작성 규칙

- 하나 이상의 문자로 이루어질 것.

- 첫 글자에는 숫자가 올 수 없다.

- 자바 키워드는 사용할 수 없다.

- $, _ 외의 특수문자는 사용할 수 없다.

 

 

(2) 결정한 클래스 이름으로 소스 파일 생성

- 클래스 이름.java

 

 

(3) 소스 파일에 아래와 같이 작성

public class 클래스이름 {  

 

}

 

 

ㅁ 클래스로부터 객체를 생성

- new 클래스();

- new 연산자로 메모리 힙 영역에 객체 생성.      //    new 연산자는 객체 생성 연산자.   배열도 객체고 String도 클래스다.

 

- 객체 생성 후 객체 번지가 리턴.

 

 

- 클래스 변수에 저장하여 변수를 통해 객체 사용이 가능하다.    

 

클래스 변수;

변수 = new 클래스();

 

클래스 변수 = new 클래스();

 

 

 

- 클래스 변수는 어떻게 만드냐면, 

객체를 만들 때 이 클래스를 가지고 만들었기 때문에,

이 객체의 번지를 저장할 수 있는 변수도,

해당 클래스의 변수로 선언이 되어야 함.

 

- 클래스 변수: 클래스로 선언한 변수이며 해당 클래스의 객체 번지가 저장됨. 

 

 

 

클래스의 두 용도

- (1) 라이브러리(API: Application Program Interface) 클래스: 객체 생성 및 메서드 제공 역할

- (2) 실행 클래스: main()메서드 제공 역할

 

(1) 

public class Student{      }

 

(2)

public class StudentExample{

  public static void main(String[] args){

      Student s1 = new Student();

      Student s2 = new Student();

  }

}

 

 

- 라이브러리는 특정 기능을 수행하는 코드의 집합입니다. 라이브러리는 재사용 가능한 코드 모듈을 제공하여 개발자가 반복적으로 사용할 수 있도록 합니다. 라이브러리를 사용하면 이미 검증된 코드를 재사용할 수 있어, 코드 작성 시간을 절약하고 오류를 줄일 수 있습니다.

 

- API는 소프트웨어 구성 요소들이 상호 작용할 수 있도록 정의된 명세서(인터페이스)입니다. API는 라이브러리, 프레임워크, 운영 체제, 웹 서비스 등과 상호작용하기 위한 방법을 제공합니다. API는 함수, 클래스, 메서드, 프로토콜 등의 집합으로 이루어져 있으며, 개발자가 특정 기능을 수행하기 위해 호출할 수 있는 명령어를 정의합니다.

 

- API는 응용프로그램 간에 소통을 하기 위한 프로그램입니다.

- API는 다른 프로그램이나 시스템에서 이용할 수 있도록 제공되는 인터페이스입니다.

 

- 모듈은 프로그램에서 하나의 기능을 수행하는 코드의 집합.

 

 

라이브러리와 프레임워크의 공통점과 차이점

- 공통점은 바로 둘다 코드의 모음이자 집합체라는 것이다

 

- 프레임워크는 라이브러리를 포함한 코드의 집합이고, 간단하게 생각하면 "라이브러리들의 모음"이며, 프레임워크는 라이브러리 보다 더 상위의 큰 개념이라고 생각하면 된다.

 

- 무엇보다 라이브러리와 프레임워크의 가장 큰 차이점은 제어 흐름에 대한 책임의 차이가 있다.

라이브러리는 개발자가 코드를 작성하는 데 필요한 도구를 제공한다. 개발자는 라이브러리를 호출하여 필요한 코드를 가져올 수 있지만, 제어 흐름은 개발자가 제어한다.

 

반면에, 프레임워크는 개발자가 작성하는 코드를 프레임워크가 제어한다. 코드는 개발자가 짜고 제어하여 원하는 위치에서 원하는 동작이 할 수 있도록 작성하는데, 결과적으로 프레임워크는 개발자가 작성한 코드를 가져와 실행한다. 이러한 현상을 제어의 역전(IoC)이라고 부른다. 이는 프레임워크가 프로그램의 아키텍처를 강제하면서 개발자가 작성하는 코드를 더 일관성 있게 만들어 준다.

 

 

클래스 멤버

- 클래스를 선언하고 클래스의 내용으로 클래스 멤버를 작성한다.          //       클래스 중괄호 내에서 선언되는 것들.

 

- 필드(field): 객체의 데이터가 저장되는 곳.           //        클래스 수준에서 선언된 변수.

- 생성자(constructor): 객체 생성 시 초기화 역할 담당.

- 메서드(method): 객체의 동작에 해당하는 실행 블록. 

 

 

 

 

28강. 필드

 

 

필드

- 객체의 고유 데이터, 객체가 가져야할 부품, 객체의 현재 상태 정보(데이터)를 저장.

- 고유 데이터(제작 회사, 모델, 색깔, 최고 속도)

- 부품(차체, 엔진, 타이어)       //       Tire 클래스로 선언된 변수 tire;

- 상태 데이터(현재 속도, 엔진 회전 수)

 

 

ㅁ 필드 선언

- 클래스 중괄호 블록 어디서든 존재(선언) 가능.

- 생성자와 메서드 중괄호 블록 내부에는 선언 불가.

- 변수와 선언 형태 유사하나 변수가 아님에 주의.

 

 

※ 필드(field)와 변수(variable)

- 자바에서 "필드"와 "변수"는 서로 관련이 있지만, 같은 것을 의미하지는 않습니다. 

 

- 변수는 값을 저장하기 위한 메모리 공간을 의미하며, 프로그램 실행 중에 값을 변경할 수 있습니다.

변수는 선언된 위치와 사용되는 범위에 따라 아래와 같이 분류됩니다.

 

지역 변수(Local Variable): 메서드 내에서 선언되며, 메서드가 실행될 때 생성되고 메서드가 종료되면 소멸됩니다.

매개 변수(Parameter): 메서드 선언부에 정의된 변수로, 메서드가 호출될 때 전달된 인수를 받습니다.

 

 

- 필드는 클래스 수준에서 선언된 변수로, 객체의 속성을 정의합니다. 

필드는 클래스의 인스턴스가 생성될 때 메모리에 할당되며, 객체가 소멸될 때까지 존재합니다. 

필드는 클래스 내부에 선언되며, 클래스의 인스턴스 변수라고도 불립니다. 

 

인스턴스 변수(Instance Variable): 클래스의 인스턴스에 속하며, 객체마다 고유한 값을 가집니다. 

클래스 변수(Class Variable): static 키워드로 선언된 변수로, 클래스의 모든 인스턴스가 공유하는 값을 가집니다.

 

 

ㅁ 같은 패키지에 속하는 클래스를 두 개 만들어서, 하나는 필드만, 하나는 main 메서드를 만들어서 다른 클래스를 이용.

- 클래스 내부의 생성자와 메서드에서는 바로 필드 사용이 가능하지만,

 

- 클래스 외부에서 필드를 사용하는 경우에는 클래스로부터 객체를 생성한 뒤 필드 사용이 가능하다.

- 필드는 객체의 데이터기 때문에 객체 없이는 필드도 없다. 

 

 

 

 

29강. 자바 생성자(1) 기본 생성자, 생성자 선언, 필드 초기화

 

 

생성자(Constructor)

- 생정자는 new 연산자로 호출되는 중괄호 블록이다.       

- 객체 생성 시 초기화를 담당한다.

 

Car myCar = new Car();           //       생성자 호출 코드

 

 

- 클래스로부터 new 연산자로 객체를 생성할 때 호출되어 객체의 초기화를 담당한다.

- 생성자는 객체가 생성될 때 호출되어 초기화를 수행하는 특수한 메서드입니다.

 

 

기본 생성자

 

- 클래스 내부에 생성자 선언을 생략할 경우 바이트 코드(.class 파일)에 자동으로 추가됨.

 

[public] 클래스이름() { }

 

- 클래스를 선언할 때 public class 클래스 { }로 선언하면 컴파일러가 기본 생성자를 추가할 때 public 붙임.

 

- 클래스에 생성자를 선언하지 않아도 new 생성자()로 객체 생성 가능한 이유가 기본 생성자가 자동으로 추가가 되었기 때문이다. 

 

- 소스파일 Car.java                        - >                                  바이트 코드 파일 Car.class

public class Car { }                    (컴파일)                           public class Car { public Car() { } }

 

 

 

ㅁ 생성자 선언

- 클래스에 생성자가 명시적으로 선언되었을 경우 반드시 선언된 생성자를 호출하여 객체를 생성하여야 한다.

(매개변수가 3개인 경우, 반드시 매개변수 3개를 다 전달해야 함.)

- 명시적으로 선언된 생성자가 있을 경우 기본 생성자가 제공되지 않아myCar()처럼 호출할 수 없다.

 

 

ㅁ 생성자를 통한 필드 초기화

- 필드와 매개 변수 이름이 동일할 경우, 'this.필드'로 표현

- this는 이 객체를 가리킴.

 

public class Korean {

   String name;

   String ssn;

 

   Korean(String name, String ssn) {

        this.name = name;

        this.ssn = ssn;

   }

}

 

 

 

 

30강. 자바 생성자(2) 생성자 오버로딩, 다른 생성자 호출 : this()

 

생성자 오버로딩

- 메서드 오버로딩: 메서드 명은 같으나 매개변수의 개수자료형이 다른 경우          //     + 순서

- 매개 변수를 달리하는 생성자를 여러 개 선언하는 것을 말함.

- 외부에서 제공되는 다양한 데이터를 사용하여 객체를 초기화하려면 생성자 역시 다양해야 함.

 

- 매개 변수의 타입, 개수, 선언된 순서가 같은 경우에, 매개 변수 이름만 바꾸는 것은 생성자 오버로딩이 아님.

 

Car(String model, String color) { ... }

Car(String color, String model) { ... }                 //       이 생성자 추가시 컴파일 에러 발생.

 

 

다른 생성자 호출: this()

- 생성자를 오버로딩을 할 경우에 생성자 초기화 내용이 비슷하면, 오버로딩된 생성자 내용이 많이 중복될 수 있다.

이런 경우에 좀 더 효율적으로 중복을 제거해서 생성자를 오버로딩. 

 

 

※ this() 코드

 

- this() 코드자신의 또 다른 생성자를 호출하는 코드이다.

- 생성자에서 다른 생성자를 호출

- 필드 초기화 내용을 하나의 생성자에만 집중 작성하고 나머지 생성자는 초기화 내용을 가진 생성자로 호출.

생성자 오버로딩 증가 시 중복 코드 발생 문제 해결.

- 다른 생성자를 호출하는 this() 코드는 생성자 첫 줄에서만 허용

 

클래스( [매개변수, ...] ) {

    this( 매개값, ..., 값, ... );           //       매개 값에 따라 클래스의 다른 생성자 호출

    실행문;

}

 

 

- 'this.변수'로 쓰일 때는 현재 객체를 말하고, 'this()'는 클래스 내의 다른 생성자를 호출하는데 사용.

 

 

 

 

31강. 자바 메서드(1) 메서드 선언

 

ㅁ 메서드 선언부(signature)

- 리턴 타입: 메서드가 리턴하는 결과의 타입 표시

 

 

- 매개 값을 받기 위한 매개 변수 선언. 매개 변수는 없을 수도 있고 여러 개 있을 수도 있음.

 

 

ㅁ 리턴 타입

- 메서드를 실행한 후의 결과값( =반환값, return값)의 타입.

- 결과값이 없다면 void로 선언.

- 리턴값이 있다면 리턴 타입이 선언부에 명시. 

 

 

ㅁ 메서드 이름

- 숫자로 시작해선 안 되고, $와 _를 제외한 특수문자 사용 불가

- 메서드 이름은 관례적으로 소문자로 작성

- 서로 다른 단어가 혼합된 이름일 경우 뒤이어 오는 단어의 첫 글자를 대문자로 작성.

 

 

 

 

32강. 자바 메서드(2) 메서드 선언, return문

 

 

매개 변수의 개수를 모를 경우

 

 

(1) 매개 변수를 배열 타입으로 선언할 수 있다.

 

int sum1(int[] values) { }               

 

- sum1이라는 메서드를 선언하는데 몇 개의 매개값이 올 지 모른다면 배열로 선언할 수 있다.

 

int[] array = { 1, 2, 3 };

int result = sum1(array);               //         배열 객체를 만들고 매개 값으로 제공하거나

 

int result = sum1(new int[] { 1, 2, 3, 4, 5 });           //         sum1을 호출할 때 배열 객체를 만들거나

 

 

 

(2) 배열을 생성하지 않고 값의 목록만 넘겨주는 방식으로 선언할 수도 있다.

 

int sum2(int ... values) { }                 //          온점 3개

 

int result = sum2(1, 2, 3);

int result = sum2(1, 2, 3, 4, 5);

 

 

- 가변인자를 사용할 때는 가변인자는 매개변수 중에서 제일 마지막에 선언해야 한다.

 

String varargsEx(String mail, String... str) { }

 

String varargsEx(String... str, String mail) { }         //       컴파일 에러

 

- 자바는 이 변수를 배열 타입 변수로 간주함.

그래서 int sum2(int ... values) { } 메서드를 만들고, (1) 처럼 배열의 주소값을 줘도 동작함.

 

- Java에서 가변 인자(Varargs)는 내부적으로 배열로 처리됩니다. 따라서, 가변 인자를 사용하는 메서드에 배열을 전달해도 동작합니다. 이는 int... values와 int[] values가 동일한 방식으로 처리된다는 의미입니다.

어떤식으로 선언하든 자바는 내부적으로 sum1을 배열 객체로 처리함.

 

 

 

※ Java에서 배열을 선언하고 초기화하는 방법

 

(1) 배열 선언 후 나중에 초기화 

 

int[] array;         //          배열 선언

array = new int[5];             //           배열 초기화 (크기 5)

 

-이 방법은 배열을 먼저 선언하고, 나중에 배열의 크기를 지정하여 초기화합니다.

 

 

(2) 배열 선언과 동시에 크기를 지정하여 초기화

 

int[] array = new int[5];          //         배열 선언과 초기화 (크기 5)

 

- 이 방법은 배열을 선언하면서 동시에 배열의 크기를 지정하여 초기화합니다.

 

 

(3) 배열 선언과 동시에 초기값을 지정하여 초기화

 

int[] array = {1, 2, 3, 4, 5};          //           배열 선언과 초기화 (초기값 1, 2, 3, 4, 5)

 

- 이 방법은 배열을 선언하면서 동시에 초기값을 지정하여 초기화합니다.

 

 

(4) 배열 선언 후, 초기값을 지정하여 초기화

 

int[] array;

array = new int[] {1, 2, 3, 4, 5};               //              배열 선언 후 초기화 (초기값 1, 2, 3, 4, 5)

 

- 이 방법은 배열을 선언한 후, 초기값을 지정하여 초기화합니다. 주로 배열의 크기를 직접 명시하지 않고 초기값을 지정할 때 사용됩니다.

 

 

(5) 다차원 배열 선언과 초기화 2차원 배열 선언과 초기화

 

int[][] array = new int[3][4];      //      2차원 배열 선언과 초기화 (3x4 배열) 2차원 배열 선언 후, 초기값을 지정하여 초기화

 

int[][] array = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };          //         2차원 배열 선언과 초기화 (초기값 지정)

 

 

 

ㅁ return문

- return문의 리턴값은 리턴타입이거나, 리턴타입으로 변환될 수 있어야 함.

 

int plus(int x, int y) {

    byte result = (byte) (x + y);

    return result;

}

 

- return 키워드는 메서드의 실행을 중지하고 호출자에게 값을 반환함. 

return 아래에 실행문을 더 쓰는 것은 의미가 없음.

 

- 리턴값이 없는 메서드(void)여도 return;을 써서 메서드 실행을 종료할 수 있음.

이때 return;은 결과값을 반환하는 게 아니라 메서드 실행을 종료하는 역할.

 

 

 

 

33강. 자바 메서드(3) 메서드 호출, 메서드 오버로딩

 

 

ㅁ 메서드가 반환값을 가지지만 호출하는 쪽에서 그 값을 사용하지 않고 무시하고자 한다면, 메서드를 호출하는 구문만을 사용할 수 있습니다.

 

 

public class Example {         

     

       public int add(int a, int b) { return a + b; }

 

       public static void main(String[] args) {

              Example example = new Example(); 

 

              example.add(2, 3);         //          반환값을 받지 않고 메서드 호출

       }

}

 

public class ClassName {

    

       void method1( String a, int b ) {       }

 

       void method2() {

            method1( "가나다", 100);               //       같은 클래스이므로 그냥 method1 이름만으로 호출.

       }

 

}

 

 

 

 

public class Calculator {
    
      static int plus(int a, int b) {
            int result = a + b;
            return result;
      }

       public static void main(String[] args) {


               plus(3, 5);
        }
    
}

 

 

- 자바에서 메서드는 클래스 내에서 선언되어야 함. 메서드 안에 또 메서드를 선언할 수 없다. 

- 단, 메서드에 반환형이 있으면 그 메서드 안에 return 문이 필요함. 

 

- 호출할 때 반환값이 있어도 받지 않고 그냥 호출만 할 수 있다.

- 객체 외부에서 호출할 때도 마찬가지로 반환값을 받지 않고 호출만 할 수 있다. 

 

 

ㅁ 메서드 오버로딩

- 리턴 타입은 상관이 없음.

- 메서드 명은 같으나 매개 변수의 타입, 개수, 순서 중 하나가 달라야 한다.

- 매개 변수의 이름상관이 없음.

 

 

int plus(int x, int y) {

  int result = x + y;

  return result; 

}

 

double plus(double x, double y) {

   double result = x + y;

   return result;

}

 

int x = 10; 

double y = 20.3;

plus(x, y);

 

- plus(double x, double y)가 실행됨.            //          이클립스서 x

- (int x, double y)인 메서드가 있으면 그걸 실행. 없어도 타입 변환이 가능한 메서드로.

 

 

ㅁ println() 메서드 오버로딩