오늘의 숙제
□ instance of 정리하기
과제
□객체지향 SOLID 원칙 (스터디하기)
신승욱 신유리 심예림 안세준
(지난 주 수업 복습)
객체지향프로그램의 목적: 클래스의 재사용성을 높이자
생성자: 객체생성 자동호출되는 특수메서드
static: 객체와 무관
- 메서드, 멤버변수
final: 끝이다
- 클래스, 메서드, 멤버변수, 지역변수
static + final +멤버변수 = 상수 (static + final 순서 상관 x)
접근제어자
용도: 정보은닉용도
상속
부모 class가 가지고 있는 멤버변수와 메서드를 자식 class가 받는 것 > class의 재사용성을 높임
단일상속, extends (예약어 사용), Is A관계(KIND OF관계)가 성립될 때에만 상속하기.
상위클래스의 멤버변수와 메서드는 하위클래스에게 상속됨. > 하위 클래스가 간결해짐.
오버라이딩
오버라이딩(overriding)은 객체 지향 프로그래밍에서 기존에 정의된 메서드를 서브클래스에서 동일한 이름으로 재정의하는 것을 말합니다.
상위클래스의 메서드를 하위클래스에서 재정의
ex)
class A{
private int i;
A(int i){this.i=}
public String toString(){ // toString 오버라이딩 된 상태, 이게 없으면 상위클래스에 toString 메서드 호출됨
return ""+i;
}
System.out.println(new A(5)); // 인자값 안넣었을 때 - A@xxxxxxxx / 5가 출력
--> void println(Object obj){
--> String의 valueOf (Object x) {
--> x.toString() 호출됨
java.lang.Object : 자바최상위 클래스
오버라이딩 규칙
1) 상속관계의 메서드
2) 메서드 이름, 매개변수(개수, 자료형, 순서), 반환형 같아야 함
3) 하위클래스메서드접근범위 >= 상위클래스메서드접근범위
ex) 3_ 아래처럼 되면 안됨
ex) 3_ 아래처럼 되야 함
오버라이딩을 해야 하는 이유
다형성 구현
기능의 재정의
프로그램의 확장성
유지 보수와 코드 가독성
다양한 동작 구현
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
접근제어자
public protected package(default) private
protected는 해당 멤버(변수 또는 메서드)가 같은 패키지 내의 클래스 또는 해당 클래스를 상속받은 클래스에서 접근할 수 있도록 제한하는 역할을 합니다.
- 다형성
다형성(polymorphism)은 객체 지향 프로그래밍의 중요한 개념으로, 하나의 인터페이스나 추상 클래스를 사용하여 여러 개체들을 동일한 타입으로 다룰 수 있는 능력을 말합니다. 다형성은 코드의 재사용성과 유연성을 높여주며 객체 지향 프로그래밍의 핵심 원리 중 하나입니다.
다형성은 다음과 같은 특징을 갖습니다:
- 오버로딩(Overloading): 동일한 메서드 이름을 가지지만 매개변수의 타입 또는 개수가 다른 여러 메서드를 정의하는 것입니다. 호출 시 전달되는 인자의 타입에 따라 알맞은 메서드가 호출됩니다.
- 오버라이딩(Overriding): 슈퍼클래스의 메서드를 서브클래스에서 재정의하는 것입니다. 동일한 메서드 시그니처(이름, 매개변수)를 가지며 서브클래스에서 원하는 동작으로 구현할 수 있습니다.
- 업캐스팅(Upcasting): 서브클래스의 객체를 슈퍼클래스 타입으로 형변환하는 것입니다. 슈퍼클래스로 업캐스팅된 객체는 슈퍼클래스에 정의된 메서드만 호출할 수 있으나, 실제로는 해당 객체의 원래 타입에 맞는 메서드가 호출될 수 있습니다.
- 다형적 변수(Polymorphic Variables): 부모 클래스의 변수로 자식 클래스의 객체를 참조할 수 있는 것을 의미합니다. 이를 통해 여러 객체를 단일 변수로 다룰 수 있으며, 실행 시에 변수가 참조하는 실제 객체에 따라 다양한 동작이 이루어집니다.
다형성은 코드의 가독성, 재사용성, 유지보수성을 향상시키며, 객체지향 프로그래밍에서 객체들 간의 관계와 상호작용을 유연하게 다룰 수 있도록 도와줍니다.
"abstract"은 객체 지향 프로그래밍에서 클래스나 메서드에 사용되는 한정자입니다.
- 추상 클래스(Abstract class): "abstract" 한정자가 클래스 앞에 사용되면 해당 클래스는 추상 클래스가 됩니다. 추상 클래스는 직접적으로 객체를 생성할 수 없으며, 상속을 통해 서브클래스에서 확장하여 사용됩니다. 추상 클래스는 일반 메서드와 추상 메서드를 포함할 수 있으며, 최소한 하나 이상의 추상 메서드를 가지고 있어야 합니다. 추상 메서드는 선언만 되고 구현은 하위 클래스에서 이루어집니다.
- 추상 메서드(Abstract method): "abstract" 한정자가 메서드 선언 앞에 사용되면 해당 메서드는 추상 메서드가 됩니다. 추상 메서드는 구현이 없이 선언만 되어 있으며, 하위 클래스에서 반드시 재정의(오버라이딩)되어야 합니다. 추상 메서드를 선언함으로써 서브클래스에서 동일한 메서드 시그니처를 가진 메서드를 구현하도록 요구할 수 있습니다.
추상 클래스와 추상 메서드는 다형성과 상속을 강화하기 위해 사용됩니다. 추상 클래스는 구체적인 동작을 가지는 메서드와 추상적인 동작을 가지는 추상 메서드를 포함하여, 일종의 템플릿 역할을 수행합니다. 추상 클래스를 상속받은 서브클래스에서는 추상 메서드를 구체적으로 구현함으로써 자신에게 맞는 동작을 추가할 수 있습니다. 추상 클래스와 추상 메서드를 사용하여 강제성과 일관성을 부여할 수 있으며, 다양한 객체들을 동일한 타입으로 다룰 수 있는 다형성을 구현할 수 있습니다.
UML 표기법
- : private
+ : public
# : protecter
클래스의 용도
- 객체를 만드는 틀
- 하위클래스들의 공통점 모아두기 (abstract class)
추상클래스와 파이널클래스
추상클래스 내부에는 추상 메서드가 있어도 되고, 없어도 된다.
(단, 추상메서드드를 포함하고 있는 메서드는 반드시 추상클래스가 되어야 한다.)
abstract/final 메서드
abstract 메서드: 반드시 하위클래스에서 재정의(오버라이딩)되어야 한다. abstract class가 되어야 한다.
final 메서드: 하위클래스에서 재정의되면 안된다.
오류 이유: 추상메서드가 오버라이딩 되지 않아서 > 반드시 하위클래스에서 재정의(오버라이딩)되어야 한다.
오류 이유: m() 메서드 재정의 금지 = 하위클래스에서 재정의되면 안되기 때문에.
new 키워드로 객체 생성 못하는 경우 2가지
1. 추상클래스일 경우, 객체생성 x
2. 생성자가 외부에 노출되지 않는 경우(private)에도 객체 생성 x
오전수업 끝(오전수업 열심히 들음 ^^)
점심먹으로 ㄱ
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
인터페이스
: 시스템에 접속할 수 있는 접속장치
- 객체를 만들 수 없다.
(오후 수업중인데 너무너무 졸리다...
점심으로 초밥을 먹어서 그런가 (연관관계x))
(오늘의 TMI
오늘 모닝루틴도...못했다....
어제 분명 일찍잤는데 아침에 늦게 일어나고....)
인터페이스
업캐스팅된 것만 다운캐스팅 할 수 있다.
직접 다운캐스팅하면 프로그램 예외발생하여 오류뜸. (예시) d=(D)b;
이벤트 프로그래밍 순서
* 이벤트프로그래밍
* 1)이벤트소스 결정
* 2)이벤트종류 결정
* 3)이벤트핸들러 작성
* 4)이벤트소스와 이벤트들러 연결
(수업시간 코드) 이벤트 프로그래밍 / 중첩클래스
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
public class GUITest {
private JFrame fr;
private JButton bt;
private JTextField tf;
class Handler implements ActionListener {
public void actionPerformed(ActionEvent e) {
String line = tf.getText();
System.out.println(line);
}
}
public GUITest() {
fr = new JFrame("실습"); // 프레임
bt = new JButton("버튼");
tf = new JTextField("입력해주세요");
Container c = fr.getContentPane(); // 프레임의 뒷판
c.setLayout(new GridLayout(2, 1));// new FlowLayout());
c.add(tf);// 컴포넌트 추가
c.add(bt);// 컴퍼넌트 추가
// 4)이벤트소스와 이벤트핸들러 연결
bt.addActionListener(new Handler());
fr.setSize(300, 150);// 프레임크기지정
fr.setVisible(true);// 프레임보여주기
}
public static void main(String[] args) {
new GUITest();
}
}
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
'JAVA 수업 > java 수업 기록' 카테고리의 다른 글
0601 수업 내용 (0) | 2023.06.01 |
---|---|
0531 수업 내용 (0) | 2023.05.31 |
0529 공부 (0) | 2023.05.29 |
0528 주말공부 (0) | 2023.05.28 |
0527 주말공부 (2) | 2023.05.27 |