본문 바로가기
Java

2024_05_29_수

by 알케니브 2024. 5. 29.

수업교재] 05. 자바 객체개념

++ 혼자공} 06.클래스- 1.객체 지향 프로그래밍, 2.필드, 3.생성자, 4.메소드

3)객체 지향 프로그래밍 특징

주요요소: 객체, 클래스,인스턴스 

항목 특징
객체(object) • 현실 세계의 사물을 컴퓨터 프로그램에 구현한 단위, 즉 클래스에 선언된 모양 그대로 생성된 실체
• 속성(attribute)과 메소드(method)로 구성 ,클래스로부터 생성되며 'new 클래스()'로 생성함
• 속성(attribute) ( 멤버변수, 인스턴스변수) 과 메서드(method)로 구성
정보처리의 주체(클래스가 아님!)
클래스(class) 객체를 만들어는 청사진, 설계도
• 객체의 속성(연관되어 있는 변수와 메소드) 정의
  객체지향 프로그래밍의 시작은 클래스의 생성

클래스에 선언되는 멤버:필드(Field), 생성자(Constructor), 메소드(Method)
필드(Field) 필드는 객체의 고유 데이터, 부품 객체, 상태 정보를 저장하는 곳
변수는 생성자와 메소드 내에서만 사용되고 생성자와 메소드가 실행 종료되면 자동 소멸됨
• 필드를 사용한다는 것은 필드값을 읽고 변경하는 작업을 말함
• 필드 초기화: 클래스로부터 객체가 생성될 떄 필드는 기본 초기값으로 자동 설정됨

생성자(Constructor) new 연산자로 호출되는 특별한 중괄호{}블록
객체 생성 시 초기화를 담
메소드(Method)  객체의 동작에 해당되는 중괄호 {} 블록
 필드를 읽고 수정하는 역할 + 다른 객체를 생성해서 다양한 기능을 수행하기도 함

• 객체 간의 데이터를 전달하는 수단
↳ 호출할 곳으로부터 매개값을 받아 실행에 이용하고, 실행 후 결과 값을 외부로 리턴할 수도 있음
↳  메소드 선언부
(= 메소드 시그니처)
   ex) 리턴타입 메소드이름 ([매개변수, ...])
• 리턴 타입: 메소드가 리턴하는 결과의 타입을 표시함
• 메소드 이름: 메소드의 기능이 드러나도록 식별자 규칙에 맞게 이름을 지어줌
• 메개 변수 선언: 메소드를 실행할 때 필요한 데이터를 받기 위한 변수를 선언
• 메소드 실행 블록: 실행할 코드를 작성함
인스턴스(Instance)  클래스로부터 생성된 객체를 소프트웨어에 실체화한 것
  같은 클래스에서 생성된 객체는 모두 인스턴스 객체임
• 클래스는 ‘설계도’, 객체는 ‘설계도로 구현한 모든 대상’을 의미한다.

 

메소드 시그니처

 

5)객체와 인스턴스

  • void란: 리턴할 때 값이 없는 메소드, 메서드가 어떤 작업을 수행하긴 하지만 그 결과값을 반환하지 않는 경우에 사용된다
  • return문 이란?
    • return: 메소드가 제대로 돌아갔는지 아닌지 확인하는 명령문
    • 메소드 선언에 리턴타입이 있는 메소드가 반드시 사용하여 리턴값을 정해야함
    • 메소드 실행에 따라 나온 값을 반환해주는 역할, return 명령 뒤에 반환하고자 하는 값 또는 변수를 써주면 됨   ex) return X;
    • 해당 메소드를 즉시 종료시켜주는 역할   ex) retern; 만 써주면 됨
    • if문에서 break와 return 차이: break는 해당 if문만 종료시키지만, return은 if문을 포함한 메소드 자체를 종료시킴
  • this.name = name; 에서 this란?
    • 자기 자신의 메모리를 가리키는 역할
    • 이 주소를 참조 타입인 클래스 변수에 저장해두면 변수를 통해 객체를 사용할 수 있다
    • 동일한 클래스 내에서 객체 자신의 또 다른 생성자를 호출하는 데 사용

9) ⭐⭐⭐접근제어자(별표 친거 네 개 확실히 구분할 줄 알아야함!

접근 제한자

항목 특징
public 해당 클래스의 필드와 메소드의 사용을 다른 모든 클래스에 허용 그리고 이들은 서브클래스로 상속
접근 제한이 전혀 없다
protected 클래스의 멤버를 클래스 자신과 이 클래스로부터 상속받은 서브클래스에만 접근을 허용
같은 패키지 내에서, 그리고 다른 패키지 내의 자손클래스에서 접근이 가능함
private 해당 클래스만이 이 멤버를 사용할 수 있으며, 외부객체에서는 절대로 접근을 할 수 없다
같은 패키지 내에서만 접근이 가능하다
default 접근제어자를 명시하지 않은 경우의 디폴트 접근제어자 같은 패키지내의 클래스들은 public 권한을 갖고 접근가능
같은 클래스 내에서만 접근이 가능하다

    

11) 선언위치에 따른 변수의 종류

항목 특징
멤버변수
 • 클래스 영역에 선언된 변수로, ‘클래스변수, 인스턴스변수’를 통틀어 칭한다.
 • 객체가 가지고 있는 속성과 기능을 그 객체의 ‘멤버’라 하는데,
이중 속성은 ‘멤버변수’라고 칭하고, 기능은 ‘메소드’라고 칭함
인스턴스변수 • 선언위치: 클래스영역
각 인스턴스의 개별적인 저장공간이며 인스턴스마다 다른 값 저장 가능함
• 인스턴스 생성 후, '참조변수.인스턴스변수명'으로 접근
• 인스턴스를 생성할 때 생성되고, 참조변수가 없을 때 가비지 컬렉터에 의해 자동 제거됨
클래스변수
(static)
• 선언위치: 클래스영역
동일 클래스내의 클래스의 모든 인스턴스들이 공유하는 변수 ex) class변수 안의 static만이 클래스변수
• 인스턴스 생성없이 '클래스이름.클래스변수명' 으로 접근
• 클래스가 로딩될 때 생성되고 프로그램이 종료될 때 소멸
클래스변수 = new 클래스();  ex) Data d1 = new Data();         참조) ch07_ex01>DataEx

↳ ⭐new 연산자 •  형태: 클래스 객체변수 = new  클래스
• new는 클래스 타입의 인스턴스(객체)를 생성해주는 역할을 담당함
+ new 연산자를 통해 메모리(heap영역)에 데이터를 저장할 공간을 할당받고, 그 공간의 참고값(reference value)을 객체에게 반환한 뒤, 이어서 생성자를 호출한다
• 인스턴스는 new 연산자를 통해 참조값을 저장한 객체로만 접근이 가능하다
•  이 주소를 참조 타입인 클래스 변수에 저장해두면 변수를 통해 객체를 사용할 수 있다
클래스변수 = new 클래스();  ex) Data d1 = new Data();         참조) ch07_ex01>DataEx
지역변수 • 프로그래밍에서 특정한 범위(스코프) 안에서만 유효한 변수
• 주로 메서드 내부에서 선언되며, 해당 메서드 내에서만 접근할 수 있음
• 메서드가 호출될 때 생성되고, 메서드가 종료되면 해당 변수의 유효 범위도 종료됨
• 변수의 범위를 제한하여 변수의 오용을 방지하고, 메모리 사용을 효율적으로 관리하는 데 도움을 줌
• 특징
1. 스코프(scope): 선언된 블록(메서드, 생성자, 제어구조 등) 안에서만 접근 가능, 블록을 벗어나면 변수에 접근할 수 없음
2. 메모리 관리: 메서드가 호출될 때 스택 메모리에 할당되며, 메서드가 종료되면 자동으로 메모리에서 제거됨
3. 초기화 필요: Java에서는 지역 변수는 사용하기 전에 반드시 초기화 되어야 함
   초기화 되지 않은 지역 변수를 사용하려고 하면 컴파일 오류가 발생함
• 예시) 메서드 내부에서 선언된 변수, 생성자 내부에서 선언된 변수, 제어 구조(if문, for문) 내부에서 선언된 변수

 

13) 멤버변수 선언

 1. 멤버 변수 

  • 클래스 영역에 선언된 변수로, ‘클래스변수, 인스턴스변수’를 통틀어 칭한다.
  • 객체가 가지고 있는 속성과 기능을 그 객체의 ‘멤버’라 하는데, 이중 속성은 ‘멤버변수’라고 칭하고, 기능은 ‘메소드’라고 칭함
  • static: 변수는 원래 초기화가 되지만, static은 초기화 없이 값이 고정이 됨
  • 종단(final)변수: 위의 표 참고

 2. 생성자

  • 생성자란?: class와 같은 명칭를 지니는 것들은 '생성자'라고 함, 객체 생성 시초기화 역할 담당
    ex)Car myCar =  newCar();
  • 기본생성자
    • 매개변수가 없는 생성자( 인자 값  == 매개변수 == parameter )
    • 클래스에 생성자가 하나도 없으면 컴파일러가 기본 생성자를 추가
    • 생성자가 하나라도 있으면 컴파일러는 기본 생성자를 추가하지 않는다
  • 생성자의 조건
    • 생성자의 이름은 클래스의 이름과 같아야 한다
    • 생성자는 리턴값이 없다. 하지만 void를 쓰지 않는다
  • 메서드 생성자(constructor)란?
    • 연산자 new에 의해서 메모리(heap)에 Card클래스의 인스턴스가 생성된다
    • 생성자 Card()가 호출되어 수행된다
    • 연산자 new의 결과로, 생성된 Card 인스턴스의 주소가 반환되어 참조변수 c에 저장된다
  • 오버로딩: 매개 변수를 달리하는 생성자를 여러 개 선언하는 것

3. final

  • final 필드
      - 초기값이 저장되면 이것이 최종적인 값이 되어서 프로그램 실행 도중에 수정할 수 없음
        초기값을 주는 방법은 필드 선언 시에 주거나, 생성자에서 주는 방법이 있다
      - 한 번 초기화되면 수정할 수 없는 필드
      - final필드는 객체마다 저장되고 생성자의 매개값을 통해서 여러가지 값을 가질 수 있기 때문에 상수가 될 수 없음 
  • final 상수
    - 상수 static final: 불변의 값(ex.원주율이나 지구의 무게)을 저장하는 필드
    - 불변의 값은 객체마다 저장할 필요가 없는 공용성을 띠고 있으며, 여러 가지 값으로 초기화될수 없기에 상수는 final 필드라고 불리지 않는다. 즉, 상수는 static이면서 final이다  
final +  특징
변수(variable) • 수정할 수 없는 변수, 변수에 붙으면 final 상수가 
• 수정할 수 없기 때문에 초기화 값은 필수적
 but, 수정할 수 없다는 범위는 그 변수의 값에 한정하며, 다른 객체를 참조하거나 할 때 참조하는 객체의 내부의 값은 변경할 수 있음
메소드(Method) override를 제한하여 상속을 통한 재정의가 불가능하도록 함
클래스(Class) override를 제한하여 상속을 통한 재정의가 불가능하도록 함

 

14) 추상클래스 abstract: 추상 메소드를 가지는 추상 클래스를 의미 (0531 일지 참조)

 


수업교재] 06. 자바 메서드와 캡슐화

7) call by reference

callby ⭐⭐⭐(면접 단골 질문)

  • Call by reference: 참조에 의한 호출, 전달받은 값을 직접 참조하기 때문에 전달받은 값을 변경할 경우 원본도 같이 변경
  • call by Value: 메소드를 만들때 리턴형으로 값을 넘기는 것, 
항목 Call by Value Call by Ref
Data Primitive 변수(기본형) 객체(객체, Array, 내장객체)
Return 반드시 ReturnType - 주소 번지 전달
객체 모든값 할당

 

10) 메소드 오버로딩

  • 클래스 내에 같은 이름의 메소드를 여러 개 선언하는 것
  • 조건
    • 매소드의 이름이 같아야 함
    • 매개 변수의 타입, 개수, 순서 중 하나가 달라야 함
    • 매개변수는 같고 리턴타입이 다른 경우는 오버로딩이 성립되지 않음

 

12)⭐접근제어자 (4가지 확실하게 구별할 줄 알아야 함!): 다른 클래스가 이 클래스를 참조할 때의 제한 사항을 지정

접근 제어자가 사용될 수 있는 곳 - 클래스, 멤버변수, 메서드, 생성자

private, default, protected, public: 위의 표 참고

 

14) 캡슐화

1.캡슐화 개념

  • 비공개화를 위해 private을 걸어둔 메소드 → 비공개화를 풀려면 get, set으로 꺼내온다

2. 캡슐화의 장점

  • 재사용성을 높이고 결합을 약하게 하여 수정에 대한 영향을 덜 받게 함
  • 캡슐화된 객체/행위에 대한 올바른 usage를 제공함
  • 객체에 포함된 정보의 손상과 오용을 막을 수 있다
  • 객체 조작 방법이 바뀌어도 사용방법은 바뀌지 않는다
  • 데이터가 바뀌어도 다른 객체에 영향을 주지 않아 독립성이 유지된다
  • 처리된 결과만 사용하므로 객체의 이식성이 좋다
  • 객체를 부품화 할 수 있어 새로운 시스템의 구성에 부품처럼 사용

16) Design Pattern ⭐⭐⭐
참고:    https://m.hanbit.co.kr/channel/category/category_view.html?cms_code=CMS8616098823

Design Pattern 개념: 유능한 개발자가 기존 환경 내에서 반복적으로 일어나는 문제들을 어떻게 풀어나갈 것인가에 대한 해결책 모음 또는 Library
Gof ⭐⭐⭐: 별 얘기 없이 디자인패턴이라 칭하면 대부분이 Gof

  1. 생성(Creational)패턴
    • 객체 생성에 관련된 패턴
    • 객체의 생성과 조합을 캡슐화특정 객체가 생성되거나 변경되어도 프로그램 구조에 영향을 크게 받지 않도록 유연성을 제공함
    • 종류
      1. Singleton 싱글톤⭐⭐⭐
        • 전역 변수를 사용하지 않고 객체를 하나만 생성하도록 하며, 생성된 객체를 어디에서든지 참조할 수 있도록 하는 패턴
        • Instance가 두 개 이상이 생성되면 프로그램이 의도치 않게 동작하거나, 자원을 불필요하게 잡아먹거나 등 결과에 일관성을 해치는 심각한 문제가 발생할 수 있음
          ==> Singleton 패턴을 적용하면 Instance 객체가 유일한 객체로서 생성되도록 하여 문제를 예방할 수 있음
      2. Abstract Factory 추상 팩토리
        • 구체적인 클래스에 의존하지 않고 서로 연관되거나 의존적인 객체들의 조합을 만드는 인터페이스를 제공하는 패턴
        • 하나의 팩토리에 조건문 형태로 구체 클래스를 생성하는 방식은 SRP 원칙에 위배되므로, 추상 팩토리 클래스를 만들어 구체적인 객체들이 구체 팩토리 클래스에서 생성되도록 함
      3. Factory Method 팩토리 메서드
        • 객체 생성 처리를 서브 클래스로 분리해 처리하도록 캡슐화하는 패턴
        • 장점
          1. 클라이언트 코드에서 객체 생성에 대한 책임을 덜 수 있음
          2. 원하는 객체를 생성하기 위해 객체의 클래스에 정의된 static메서드를 호출하면 됨
            이를 통해 직접적인 생성을 통해 발생하는 의존성을 줄일 수 있으며, 이름이 직관적인 함수를 사용할 수 있음
        • 직접 생성자를 호출하지 않는 이유: 다른 코드의 변화로부터 독립적인 코드를 작성할 떄 생성자 때문에 제약이 생길 수 있기 때문.
          ↳ 생성자는 각각 확정된 객체(Concrete Object)가 있어야 호출될 수 있으며, 확정된 객체에 변화가 생기면 잠재적으로 수정될 가능성이 생김. 이는 곧 생성자를 직접 호출한 코드에서도 수정이 필요함을 의미함. 따라서 변화에 대응하기 쉽도록, 생성자를 따로 관리할 수 있게 하기 위해서임.
  2. 구조(Structural)패턴
    • 클래스나 객체를 조합해 더 큰 구조를 만드는 패턴
      즉, 서로 다른 인터페이스를 지닌 두 개의 객체를 묶어 단일 인터페이스를 제공하거나 객체들을 서로 묶어 새로운 기능을 제공하는 패턴 
    • 종류 
      1. Facade: 서브 시스템에 있는 일련의 인터베이스를  통합 인터페이스로 묶어줌
      2. Composite: 여러 개의 객체들로 구성된 복합 객체와 단일 객체를 클라이언트에서 "구별 없이" 다루게 해주는 패턴
      3. Decorator: 객체의 결합을 통해 기능을 동적으로 유연하게 확장할 수 있게 해주는 패턴
  3. 행동(Behavioral)패턴: 객체나 클래스 사이의 알고리즘이나 책임 분배에 관련된 패턴
    한 객체가 혼자 수행할 수 없는 작업을 여러 개의 객체로 어떻게 분배하는지, 또 그렇게 하면서도 객체 사이의 결합도를 최소화 하는 것에 중점을 둠
    • 종류
      1. Command:  실행될 기능을 캡슐화함으로써 주어진 여러 기능을 실행할 수 있는 재사용성이 높은 클래스를 설계하는 패턴
      2. Observer:  한 객체의 상태 변화에 따라 다른 객체의 상태도 연동되도록 일대다 객체 의존 관계를 구성하는 패턴
      3. State: 객체의 상태에 따라 객체의 행위 내용을 변경해주는 패턴
      4. Strategy:  행위를 클래스로 캡슐화해 동적으로 행위를 자유롭게 바꿀 수 있게 해주는 패턴
      5. Template Method:  어떤 작업을 처리하는 일부분을 서브 클래스로 캡슐화해 전체 일을 수행하는 구조는 바꾸지 않으면서 특정 단계에서 수행하는 내역을 바꾸는 패턴
생성(Creational)패턴 구조(Structural)패턴 행동(Behavioral)패턴
Singleton⭐⭐⭐

Factory Method

Abstract Factory 추상 팩토리⭐

Builder

Prototype
Facade

Adapter

Composite

Decorator

Flyweight

Proxy

Cahin of Responsibility 책임 연쇄

Command

Interpreter

Iterator

MKediator

Memento

Observer

State

Strategy

Template Method

Visitor
  • Singleton--> 코딩 SingleTon 참고
    1) 개념
    • 특정 클래스의 instance를 하나만 생성하도록 보장하는 패턴
    • 객체의 인스턴스가 오직 1개만 생성되는 패턴을 의미, 2개 이상을 생성할 때는 사용하지 않음
    • 전체 프로그램에서 단 하나의 객체만 만들도록 보장해야 하는 경우 만듬
    • 싱글톤을 만들려면 클래스 외부에서 new 연산자로 생성자를 호출할 수 없도록 막아야함
    • 외부에서 생성자 호출을 막기 위해 private(public(X))를 붙여줌
    2) 사용이유: 메모리 절감 + 다른 클래스 간에 데이터 공유 용이
    3) 사례: DB접근( 한 사람이 두 개 이상의 서버를 사용하지 못하게하여 서버에서 일어날 미연의 사건(Dos공격 등)이나 메모리 절감을 위해 사용
    4) 장점특정 클래스의 instance를 하나만 생성하도록 보장하는 패턴특정 클래스의 instance를 하나만 생성하도록 보장하는 패턴
    • 유일한 인스턴스(단일 인스턴스): 싱글톤 패턴이 적용된 클래스의 인스턴스는 애플리케이션 전역에서 단 하나만 존재하도록 보장함, 이는 객체의 일관된 상태를 유지(⭐)하고 전역에서 접근 가능하도록 함
    • 메모리 절약⭐⭐: 인스턴스가 단 하나뿐이므로 메모리를 절약할 수 있음, 생성자를 여러 번 호출하더라도 새로운 인스턴스를 생성하지 않아 메모리 점유 및 해제에 대한 오버헤드를 줄임
    • 지연 초기화: 인스턴스가 실제로 사용되는 시점에 생성하여 초기 비용을 줄일 수 있음
  • 5) 단점
    • 결합도 증가: 싱글톤 패턴은 전역에서 접근을 허용하기 때문에 해당 인스턴스에 의존하는 경우 결합도가 증가할 수 있음
    • 테스트 복합성: 싱글톤 패턴은 단 하나의 인스턴스만을 생성하고 자원을 공유하기 떄문에 싱글톤 클래스를 의존하는 클래스는 결합도 증가로 인해 테스트가 어려울 수 있음
    • 상태 관리의 어려움: 만약, 싱글톤 클래스가 상태를 가지고 있는 경우 전역에서 사용되어 변경될 수 있으며, 이로 인해 예상치 못한 동작이 발생할 수 있음
    • 전역에서 접근 가능: 애플리케이션 내 어디서든 접근이 가능한 경우, 무분별한 사용을 막기 힘들며, 이로 인해 변경에 대한 복잡성이 증가할 수 있음
  • 6) Singleton과 instance와 getInstance의 정의와 관계⭐⭐⭐
    • Singleton 패턴
      • 객체가 하나만 생성되도록 보장하는 클래스
      • 특정 클래스의 instance를 하나만 생성하도록 보장하는 패턴
      • 내부에 유일한 instance를 가지며, 이 instance를 외부에서 접근할 수 있도록 메소드를 제공함
    • instance 객체
      • Singleton 클래스에서 생성되는 유일한 객체, 외부에서는 이 instance에 접근하여 필요한 작업을 수행함
      • 만약 'instance'가 아직 생성되지 않았다면, 새로운 'Singleton' 객체를 생성하여 반환함
        이렇게 하면 프로그램 전체에서 오직 하나의 'Singleton' 객체만 사용됨
    •  getInstance() 메서드
      • Singleton 클래스의 유일한 instance를 반환하는 메서드
        이 메소드는 클래스의 유일한 인스턴스를 반환하기 때문에, 이 메소드를 통해 어디서든 동일한 객체에 접근할 수 있음
      • getInstance()는 내부적으로 생성되지 않았으면 생성함
      • 기존에 생성된 값이 존재하면 생성된 인스턴스를 리턴하는 형태로 반환함, 따라서 여러 변수들은 싱글톤에서 동일한 객체를 참조하게 됨
  • Architecture Pattern과의 비교
    ↳ Architecture Pattern이란?
    • 소프트웨어 시스템의 기본 구조와 그러한 구조 및 시스템을 만드는 분야
    • 각 구조는 소프트웨어 요소, 소프트웨어 요소들과의 관계, 요소와 관계의 속성으로 구성됨
    • 시스템 및 개발 프로젝트의 청사진 역할을 하며 설계팀이 실행하는데 필요한 작업을 제시함
    • 기본원리
      1. 모듈화: 시스템의 기능들을 모듈단위로 나누는 것
        이때 모듈 개수는 너무 적거나 너무 많지 않아야 함. 많을 경우 통합 비용이 많이 들게 되며, 적을 경우 하나의 개발 비용이 많이 들게 됨
      2. 추상화: 전체적이고 포괄적인 개념부터 설계한 후 구체적인 개념을 세분화함
      3. 단계적 분해: 문제를 상위의 중요 개념으로부터 하위의 개념으로 구체화시키며 분할함
      4. 정보 은닉: 한 모듈 내부에 포함된 절차와 자료를 숨기며 독립적 수행을 가능하게 하여, 다른 모듈이 접근하거나 변경하지 못하게 함
패턴명 Design Pattern  Architecture Pattern
차이점 - 모든 아키텍처 패턴은 디자인 패턴이지만 모든 디자인 패턴이 아키텍처 패턴일 수는 없음
- MVC와 마찬가지로 둘 모두에 속할 수 있음
- 둘 다 재사용 가능한 해결책을 제공하지만 적용 범위와 목적이 다름
- Singleton 패턴은 아키텍처 패턴이 될 수 없다⭐⭐⭐

목적 주로 소프트웨어 설계에서 발생하는 특정 문제를 해결하기 위한 구체적인 방법을 제공함 시스템 전체의 구조를 정의하고, 전반적인 설계 원칙을 제공하여 시스템의 주요 컴포넌트 간의 관계를 설명
적용 범위 개별적인 클래스나 객체의 구조, 코드 수준의 설계나행위와 관련된 비교적 작은 규모의 세부적인 문제에 집중함 시스템 전체나 서브시스템 수준에서의 큰 규모의 컴폰너트 문제에 집중
특징
  • 객체 간의 상호작용과 역할 분담을 통해 코드의 유연성과 재사용성을 높임
  • 특정 컨텍스트에서 발생하는 일반적인 문제를 해결하기 위해 검증된 해결책을 제공
  • 코드의 유지보수성과 확장성을 향상시킴
  • 구축 단계에서 제공됨
  • 시스템의 주요 구성 요소와 이들 간의 상호작용을 정의함
  • 시스템의 성능, 확장성, 유지보수성을 고려하여 고수준의 구조적 접근을 제공함
  • 대규모 시스템의 설계와 구현을 위해 전체적인 틀을 제시함
  • 설계 단계에서 제공됨
예시 Singleton, Observer, Factory, Strategy 등 MVC (Model-View-Controller), Microservices, Layered Architecture, Event-Driven Architecture 등
  •  

수업교재] 07. 자바 상속 - 중첩 Class

1) 상속의 정의

  • 기존의 클래스를 재사용해서 새로운 클래스를 작성
  • 자바에는 부모 클래스(상위 클래스)와 자식 클래스(하위 클래스) 가 있다
    자식 클래스는 부모 클래스를 선택해서 그 부모 클래스의 멤버를 상속받아 그대로 쓸 수 있게 된다.
  • 자손은 조사의 모든 멤버를 상속받는다 (생성자, 초기화블럭 제외)
  • 자손의 멤버개수는 조상보다 많거나 같다

2) 상속을 하는 이유?

  • 유지보수가 쉬워짐
  • 확장성이 용이해짐
  • 재사용이 가능해짐
  • 코드가 간결해져 시간을 단축할 수 있음

 

4) 상속 (클래스의 관계)

⭐⭐⭐⭐⭐Interface는 implement, class는 extends

//클래스의 선언

[접근 제어자] class 클래스명
	[extends 상위 클래스명]
    [implements 인터페이스명]	{
    	...... // 클래스 멤버 부분
}
class 자식클래스 extends 부모클래스 {
//필드
//생성자
//메소드
  • 정의: 부모 클래스(객체)의 멤버들을 자식 클래스(객체)가 물려받는것
  • 자바에서는 단일 상속만이 가능하다
  • 상속계층도의 최상위에는 Object클래스가 위치한다
  • Super: 하위 클래스에 의해 갈진 상위 클래스의 멤버 변수나 메소드에 접근할 때(super.객체변수, super.메소드이름(매게변수))

++ 나머지 상속 설명은 0603 설명 참조


오늘의 코딩

순서

ch07_ex01

  • ⭐⭐⭐⭐⭐DataEx: 키워드는 주소값
package ch07_ex01;
//★★★면접 단골질문
// Call By Value && Call By Reference ---> ***
//
class Data	{		//class는 Java의 설계도
	int kor;
	int eng;
	int math;
	//Call by Reference를 콜
	void addRef (Data d1, Data d2)	{
		d1.kor	= d2.eng;
		System.out.println("Methid국어 점수 : " + d1.kor);
	}
	// Call By Value
	int				addkor(int kor)	{
	//Return Type	//return Method parameter
	//수행하다가 리턴할때 변수(여기서는 int)를 돌려준다는 뜻
		kor	+= 10;
		System.out.println("kor=>"+kor);
		return kor;
//		return이란?: 위에서 매겨진 값(20)이 아래의 자리(d3.addkor(10))에 호출되어 입력된다
//					return이 없으면 값에 들어가지 않는다, 걍 문법임!!!
	}
}

public class DataEx {	//public class의 첫글자는 소문자로 작성

	public static void main(String[] args) {
		//	확보공간의 주소를 가지고 있다
		Data d1 = new Data();
		Data d2 = new Data();
		Data d3 = new Data();
//		int d3_kor = d3.addkor(10);
		//위의 addkor(int kor)에 들어가게됨
//		System.out.println("d3_kor->"+d3_kor);
		d1.kor = 50;
		d1.math = 70;
		d2.eng = 80;
		//★★★instance를 넘기면 주소값을 넘겨주는 효과(ex) d1->d2
		//이 점수가 위의 Data d1, Data d2로 들어가게 됨
		d3.addRef(d1, d2);
		System.out.println("Main 국어 점수 : " + d1.kor);

		//Call By Value Call
		int d3_kor = d3.addkor(10);
		System.out.println("d3_kor -> + d3_kor");
		System.out.println("d3.kor -> + d3.kor");	}

}
  • EncapsuleEx: getter and setter
package ch07_ex01;

class Encapsule {
	private String name;
	private int	   age;
//	public String name;
//	public int	   age;
	
	//private는 밖에서 건드릴 수 없기 때문에 getter&setter로 
	public String getName()	{
		return name;
	}
	
	public int getAge()	{
		return age;
	}
	public void setName(String name) {
		this.name = name;
	}
	public void setAge(int age)	{
		if (age < 0) System.out.println("나이입력오류 ㅎㅎㅎ");
		else this.age = age;
	}
		
		
}
public class EncapsuleEx {
	
	public static void main(String[] args) {
		Encapsule h1 = new Encapsule();
//		h1.name = "김준수";
//		h1.age = -10;
		h1.setName("김준수");
		h1.setAge(-10);
		
		System.out.println("이름 : " + h1.getName());
		System.out.println("나이 : " + h1.getAge());
	}

}
  • Return01: divide 할 때 똘려줄 값 신경쓰기
  • Return02
  • FactorialEx: (재귀함수: 자기 자신을 재호출하는 함수)
  • HiEx
  • OverLoadingEx
  • StaticMethod
  • ThisEx
package ch07_ex01;

class G2	{		// class와 같은 명칭를 지니는 것들은 '생성자'라고 함
					// class변수 안의 static만이 클래스변수다
	int k;
	
	G2 () {
		System.out.println("매개변수 없다");
	}
	
	G2 (int k) {
	    this();		//()소괄호를 치면 기본생성자라는 표시
	    this.k = k;		//this ≒ 나의
	    System.out.println("매개변수 1개 = " + k);
	}
	
	G2 (int k, int y)	{
		this();
		this.k = k;
		System.out.println("매개변수 2개 k= " + k + "y = " + y);
	}
	void print()	{		//class의 기능을 하는 것, 밖에서 class의 기능을 하게 하는 것이 메소드
		System.out.println("k= " + k);
	
	}

public class ThisEx {

	public static void main(String[] args) {
		G2	g2 = new G2(7);
		g2.print();
		G2	g3 = new G2(7, 13);
		g3.print();

	}

	
	}
}
  • SingleTonEx: DB때 쓰임

ch07_ex02 : Source>>Generate getter and setter

  • Student
package ch07_ex02;

public class Student {
	private String name;
	private int	   age;		//ex)0세 ~ 100세
	private String sno;		//ex)학번 10000번 ~ 99999번
	
	public void printAll()	{
		System.out.println("이름: " +name+ " , 나이 : "+ age+" 학번 : " +sno);
	
	}
	//아래가 나오게 하려면 작업표시줄의 Source>>Generate getter and setter
	//getter는 읽을 때, setter는 저장할 때
	//setter는 특히 주의하기

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getSno() {
		return sno;
	}

	public void setSno(String sno) {
		this.sno = sno;
		//조건문은 이 자리에 걸어두면 됨,비즈니스 룰을 따라야 할 때 혹은 공지해야 할 때
		// ex) if (sno > 100000 && sno<99999)
		//if
		//else
		
	}
	

}
  • Teacher
  • Manager
  • PersonEx:  수정이 편하도록 주석처리된 부분 처럼 코드를 짜지 않는다
package ch07_ex02;

import ch07_ex01.Manager;

public class PersonEx {

	public static void main(String[] args) {
		Student st1 = new Student();
		st1.setName("수지");
//		st1.name = ("수지");
		st1.setAge(21);
		st1.setSno("1111");
//		st1.sno = 100;
		
		Teacher th1 = new Teacher();
		th1.setName("길동");
		th1.setAge(35);
		th1.setSubject("Java");
		
		Manager mg1 = new Manager();
		mg1.setName("원빈");
		mg1.setAge(19);
		mg1.setPart("청소");
		
		System.out.println("이름: " +st1.getName()+ " , 나이 : "+ st1.getAge()+" 담당 : " +st1.getSno());
		
		th1.printAll();
		mg1.printAll();

	}

}

ch07_ex03

  • Calculator
  • CalculatorEx

ch08_ex01

  • OverRide01
  • OverRide02
  • OverRide03
  •  
package ch08_ex01;

//하나 이상의 추상 Class를 선언할때는 abstract class를 사용
abstract class C1	{
	int k;
	public C1()	{
		System.out.println("추상Class 생성자");
	}
	void setK(int k)	{
		this.k = k;
		
	}
	abstract void print();
	//템플릿패턴이라고 함
	//하나이상의 추상 메소드가 존재해야 함 
	//--> 추상 메소드: 메소드의 정의만 존재하는 메소드, 실제로 구현한게 X
}

class C2 extends C1	{
	//C2를 바로 사용 못함--> 커서 갖다 대고 Add implemented methods클릭

	@Override
	void print() {
		// TODO Auto-generated method stub
		
	}
	
	void print3()	{
		System.out.println("C2 print3");
	}
	
}
public class OverRide03 {

	public static void main(String[] args) {
//		C1 c1 = new C1();
					//C1은 instance 할 수 없다 
					//∵ 하나 이상의 '추상' Method를 가지고 있기 떄문
		C1 c1 = new C2();
		c1.setK(12);
		c1.print();
//		c1.print3();	--> 부모는 자식 것을 쓸 수 없음
		
		C2 c2 = new C2();
		c2.setK(7);
		c2.print();		//	c2.k 와 c1.k  -->각각의 값은 다름
		c2.print3();
	}
}

 


오늘의 숙제

  • HiEx
    • 내가 한것
package hw05_0529;

import java.util.Scanner;

//HW	>>FactorialEx, 재귀함수 참고
class D1 {
	int result = 1;
	void hi (int cnt)		{
		if (cnt > 1)	{
			result	*=cnt;
			System.out.print( cnt + " * ");
			hi(--cnt);
		}
		else	{
			System.out.println( cnt );
			System.out.println("HiEx 결과는 " + result );
			return;
		}		
	}
}

public class HiEx_hw {

	public static void main(String[] args) {
		D1		e = new D1();
		int		InNum;
		System.out.println("HiEx 합 10이하의 숫자를 입력하세요 ?");
		Scanner sc = new Scanner(System.in);
		InNum = sc.nextInt();
		e.hi(InNum);

	}
}
  • 선생님이 하신 것
package ch07_ex01;

//HW	>>FactorialEx, 재귀함수 참고
class D1 {
	void hi (int cnt)	{
		System.out.println("안녕, 나야 !!   cnt-->" + cnt);
		if (cnt < 1) return;
		hi(--cnt);
	}	
}

public class HiEx {

	public static void main(String[] args) {
		D1 d = new D1();
		d.hi(6);
	}
	
}

 

  • Overloading: 생성자 오버로딩, 메소드 오버로딩
    • 선생님이 하신 것
package ch07_ex01;
//HW2
class OverLoad {	//overloadin: 매개 변수를 달리하는 생성자를 여러개 선언하는 것

	void print()	{
		System.out.println("매개변수 없다");
	}
	void print(int x) {
		System.out.println("매개변수 1개 Int =" + x);
	}
	void print(String str)	{
		System.out.println("매개변수 1개 str" + str);
	}
	void print(String str, int y) {
		System.out.println("매개변수 2개 str["+ str + "] , int = " + y) ;
	}
	
	public class OverLoadingEx {

		public static void main(String[] args) {
			OverLoad ol = new OverLoad();
			ol.print();
			ol.print(12);
			ol.print("대박");
			ol.print("금요일", 16);
		}	
	
	}
}
  • Calculator
    • 선생님이 하신 것
    •  

 

'Java' 카테고리의 다른 글

2024_06_04_화  (0) 2024.06.04
2024_06_03_월  (0) 2024.06.03
2024_05_31_금  (0) 2024.05.31
2024_05_30_목  (0) 2024.05.30
2024_05_28_화  (0) 2024.05.29