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