JAVA
절차 지향(Procedural Programming)
절차지향은 프로그램을 "순서에 맞게" 작성하는 것
>> 흐름도(플로우 차트)
객체 지향(Object - Oriented Proframming) OOP
객체지향은 프로그램을 "객체 단위"로 나누어 작성하는 것
>> 객체지향 코딩 특히 웹에서는 순서가 사용자에 의해 변경되기 때문에 객체지향이 용이
장점
상속, 캡슐화, 다형성이 특징으로 코드를 재사용하거나 확장하기 좋고 유지보수가 쉬움
단점
캡슐화와 격리구조 때문에 절차지향 프로그래밍보다 실행 속도가 느림
객체지향 프로그래밍에서 객체는 변수, 함수, 자료구조의 조합이 될 수 있는데,
특히 객체지향 프로그래밍에서 클래스를 기반으로 한 변수를 클래스의 인스턴스라고 표현함
클래스란 멤버 변수와 메서드를 가지는 객체를 만들기 위한
확장이 가능한 코드 양식임 => 객체를 찍어내기 위한 틀, 설계도 == "JAVA의 기본단위"
인스턴스란 설계도에 따라 구현된 실체가 인스턴스임
// 객체지향의 핵심
// 같은 메서드를 수행시켜도
// 다른 주체자가 수행했다면
// 다른 결과가 나온다.
// Animal 클래스
class Animal {
String type;
String name;
Animal(String type){
this(type,"무명");
}
Animal(String type,String name){ // 생성자
this.type=type;
this.name=name;
}
void hello() { // 매서드
System.out.println(this.type+" "+this.name);
}
}
★ 생성자 함수
1. 클래스명과 동일한 함수임
2. new 연산자랑 함께 사용되며,
3. 객체를 생성하는 목표를 가진다
>> 생성자 함수는
수행결과, 당연히 객체를 반환하기 때문에
반환 타입 명시 XXX
4. 내부의 값을 모두 초기화시켜주는 역할을 담당
>> heap 메모리 영역을 사용하기에 가능한 일
>> 멤버변수 초기화 == 멤버변수의 값을 '강제'
내부의 값 == 멤버변수, 필드, 속성. attribute, property, ...
5. JAVA에서 기본 제공해줌
상속(Inheritance)
상속은 객체들 간의 관계를 구축하는 방법이다 클래스로 객체가 정의되는 고전 상속에서,
클래스는 기반 클래스, 슈퍼 클래스, 또는 부모클래스 등의 기존의 클래스로부터 속성과 동작을 상속 받을 수 있다
상속을 해주는 객체를 부모클래스, 슈퍼클래스, 조상 클래스
상속을 받는 객체를 자식클래스 등으로 표현함
장점
상속을 통해 적은 양의 코드로 새로운 클래스를 작성할 수 있고 코드를 공통적으로 관리할 수 있기 때문에
코드 추가와 수정이 용이함 이런 특징은 코드의 재사용성을 높이고, 중복을 제거하여
프로그래밍 생산성과 유지보수에 크게 기여함
// 부모 클래스(상위 클래스)의 코드를
// 자식 클래스(하위 클래스)가 전부 '재사용' 할 수 있다.
// "유지보수 용이성 극대화"
// 코드를 잘게잘게 잘라야함 == 모듈화(컴포넌트화,함수화)
// --->> 코드 재사용성 증가
// 오류 발견시 수정을 적게함
// --->> 오류의 파급효과 절감
// 결과를 다양하게 추출할수있음
// 개발시간 단축,개발비용 축소
// 상속
class Cat extends Animal {
// Cat객체는 type이 죄다 '고양이'고 이름을 정하지않으면 '나비'임
Cat(){
this("나비");
}
}
class Dog extends Animal {
Dog(){
this("요요");
}
}
class XXX extends 상속해줄클래스{
}
public static void main(String[] args) {
// new 연산자를 이용하여 객체 생성가능
Cat 길고양이=new Cat();
Dog dog = new Dog();
}
클래스를 상속받으면 해당 클래스의 코드를 전부 재사용가능
자식 클래스의 모든 생성자들은 가장먼저
부모 클래스의 기본 생성자를 호출
1. 부모 클래스에 기본 생성자를 선언(정의) xXXX
=>> 먼저 작성된 코드를 나중에 작성되는 코드때문에 변경한다 ?
=====>>> 대부분 잘못된 해결방식
기본 생성자를 사용하지 않는 이유는 "강제성"
기본 생성자를 만들어 버린다 ? 강제성을 잃게
2. 부모 클래스에게 존재하는 다른 생성자를 대신 사용 O
자식 클래스의 객체를 만들때에는
부모 클래스의 생성자 선 호출 =====>>>>>>> 자식 클래스의 생성자 호출
부모 생성자로 기본 틀을 채우고
자식 생성자로 남은 부분(추가된 부분)을 채움
다형성( Polymorphism)
다형성은 어떤 객체의 속성이나 기능이 상황에 따라 여러 가지 형태를 가질 수 있는 성질을 의미함
==>> 어떤 객체의 속성이나 기능이 그 맥락에 따라 다른 역할을 수행할수 있는 객체 지향의 특성
장점
다형성을 사용하면 코드의 재상용성과 유연성이 향상되며, 코드의 가독성도 높아짐
다형성의 대표적인 예
1. 오버로딩(Overloading)
2. 오버라이딩(Overriding)
오버로딩
오버로딩을 한국어로 표현하면 "함수명 중복정의 허용" 이라고 표현할 수 있음
함수명(메서드명)이 같은데, 메서드 시그니쳐(input)가 다를 때 사용함
상속과 무관
오버라이딩
"메서드 재정의" 상속관계에서만 발생되며
메서드명도 같고, 메서드 시그니쳐도 같아야됨
1. 상속
2. 메서드명이 동일(메서드 시그니쳐 동일)
3. 기능이 같을 때
4. 코드가 다른 상황
"자식 메서드가 부모 메서드를 쓰고는싶어
근데 ? 내 마음엔 쏙 들진 않아
바꿔서 쓰고 싶어" == 오버 라이딩(메서드 재정의)
class Animal {
String type;
String name;
Animal(String type){
this(type,"무명");
}
Animal(String type,String name){ // 오버로딩
this.type=type;
this.name=name;
}
void hello() {
System.out.println(this.type+" "+this.name);
}
}
class Cat extends Animal {
// Cat객체는 type이 죄다 '고양이'고 이름을 정하지않으면 '나비'임
Cat(){
this("나비");
}
Cat(String name){ // 오버로딩
super("고양이",name);
}
@Override
void hello() { // 오버라이딩
System.out.println("야옹");
}
}
class Dog extends Animal {
Dog(){
this("요요");
}
Dog(String name){ // 오버로딩
super("강아지",name);
}
@Override
void hello() { // 오버라이딩
System.out.println("멍멍");
}
}
★ ★ ★ 함수와 메서드 ★ ★ ★
함수 : 주어가 없음. 절차지향. 문제를 해결하는것이 중요메서드 : 주어가 있음. (객체.메서드()) 객체지향. 객체가 해당 기능을 수행하는 것
'javaboiii의 JAVA > JAVA 기초' 카테고리의 다른 글
JAVA - 컬렉션 프레임워크(배열리스트, 맵) (0) | 2024.07.15 |
---|---|
JAVA - 객체지향 feat.캡슐화, 추상화, 인터페이스 (0) | 2024.07.12 |
JAVA - 이중 for문 (0) | 2024.06.27 |
JAVA - 배열 (Array) (0) | 2024.06.27 |
JAVA - 연산자(Operator) (0) | 2024.06.26 |