오늘보다 더 나은 내일의 나에게_

Java OOP, 생성자 본문

JAVA

Java OOP, 생성자

chan_96 2022. 1. 13. 06:16
728x90

언어의 종류

절차 지향 언어

장점
- 코드의 구조가 컴퓨터 처리구조와 유사하여 실행 속도가 빠름

단점
-유지보수가 어렵다
=> 모든 구성요소가 유기적으로 연결되어 하나가 고장 나면 전체가 고장남

- 코드 순서가 바뀌면 결과가 달라질 수 있다
=> 생산 효율이 떨어진다


객체지향 언어

: 독립된 객체 간 상호작용 (JAVA, C++, C#)

장점
- 재사용성

- 유지보수가 쉬워 생산성이 증가
=> 한 부분이 고장나면 문제 되는 부분만 수정하면 된다

- 개발자가 생각하는 대로 자연스럽게 모델링할 수 있다
=> 객체는 세상에 존재하는 모든 것이기 때문에 우리가 사는 세상과 닮아있다


단점
- 개발 속도가 느리다
=> 모든 객체의 역할과 기능을 이해해야 하므로 작성하는데 많은 시간이 소요된다

- 실행 속도가 느리다
=> 처리 속도가 절차 지향 언어보다 느리다

- 난이도가 높다

함수형 언어

: 자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임

OOP(Object Oriented Programming)

:프로그램을 명령어의 목록으로 보는 시작에서 벗어나 여러 개의 독립된 단위, "객체"들의 모임으로 파악하고자 하는 것

class의 구조

필드(field) - 변수, 상수(final)
메서드(method)

object의 구조

필드 - 자료형 변수
메서드 - 메서드 정의

OOP의 특징

추상화(Abstraction)
- 객체에서 공통된 속성과 행위를 추출하는 기법
- 코드 상에서 구현(로직) 부분을 제외한 오직 선언 부분만을 설계
- 상세한 정보는 무시하고 필요한 정보들만 간추려서 구성


캡슐화(Encapsulation)
- 관련된 필드(속성)와 메소드(기능)를 하나로 묶고, 실제 구현 내용을 외부로부터 감추는 기법(정보은닉)
- 만일의 상황(타인이 외부에서 조작)을 대비해서 특정 속성이나 메소드를 사용자가 조작할 수 없도록 숨겨 놓은 것.
- 외부에서는 공개된 메소드(기능)의 인터페이스를 통해 접근할 수 있다.


상속(Inheritance)
- 이미 작성된 클래스(상위 클래스)의 특성을 그래도 이어받아 새로운 클래스(하위 클래스)를 생성하는 기법
- 기존 코드를 그대로 재사용하거나 재정의 -> 재사용 + 확장


다형성(Polymorphism)
> 메서드 오버 로딩

- 사전적 의미 '다양한 형태로 나타날 수 있는 능력'
- 같은 기능(메소드)를 호출하더라도 객체에 따라 다르게 동작하는 것
- 상위 클래스의 동작을 하위 클래스에서 다시 정의하여 사용(Overriding)하는 것 또한 다형성으로 볼 수 있다
=> 오버라이딩 : 매개변수, 반환 값 모두 동일 + 로직만 다르게!


객체지향 프로그래밍의 장점

- 신뢰성 있는 소프트웨어를 쉽게 작성할 수 있다.
- 코드를 재사용하기 쉽다
- 유지보수가 용이하다
- 직관적인 코드 분석이 가능하다
- 소프트웨어 생산성이 향상된다.


클래스 생성 예시

: 춘식이라는 클래스 생성 후 춘식메인 클래스에서 호출
- 필드에는 이름, 레벨, 공격력 작성
- 메서드에는 공격하기, 걷기 작성
더보기
package 예제1;

public class 춘식메인 {
	public static void main(String[] args) {
		// 춘식 캐릭터(객체, 인스턴스) 생성
		new 춘식(); //춘식타입의 객체 생성
		
		//춘식 객체의 참조값을 저장하고 있는 레퍼런스 변수 선언
		춘식 cs = new 춘식();
		
		//현재 속성 출력
		
		//생성된 춘식 인스턴스의 레벨에 접근
		System.out.println(cs.level);
		
		//생성된 춘식 인스턴스의 공격 기능(메소드) 사용
		cs.attack();
		
		//춘식 인스턴스의 속성값 할당
		cs.name = "내 춘식이";
		cs.level = 20;
		cs.power = 50;
		
		System.out.println("이름 : "+cs.name);
		System.out.println("레벨 : "+cs.level);
		System.out.println("공격력 : "+cs.power);
		
		cs.attack();
	}
}

public class 춘식 {
	// 춘식이 캐릭터 설계
	// 속성(field), 행동(method)
	//1. 속성(field) : 이름, 레벨, 공격력
	String name; //이름이 있어야돼!
	int level;
	int power;
	
	//2. 행동(method) : 공격한다, 걷는다
	public void attack() {
		System.out.println("공격!");
	}
	public void walk() {
		System.out.println("걷는다!");
	}
	
}


예제 주소록(AddressList) 클래스 만들기
속성(필드) 기능(메소드)
이름, 주소, 번호 주소록 출력(showAddr)
더보기
package 예제1;

public class AddressListMain {
	public static void main(String[] args) {

		//객체(인스턴스) 생성
		AddressList al = new AddressList();
		
		al.name = "김헌찬";
		al.address = "광주광역시 동구";
		al.pNumber = "010-0000-0000";
		
		al.showAddr();
	}
}

public class AddressList {
	//속성(필드) : 이름, 주소, 번호
	String name;
	String address;
	String pNumber;
	
	//메소드
	public void showAddr() {
		System.out.println("이름 : " + name);
		System.out.println("주소 : " + address);
		System.out.println("번호 : " + pNumber);
	}
}

예제 저금통 클래스 만들기
속성 메서드
금액(money) 돈을 넣는다(deposit)
돈을 인출한다(withdraw)
잔액을 보여준다(showMoney)
더보기
package 예제1;

public class PiggyBankMain {
	public static void main(String[] args) {

		PiggyBank pb = new PiggyBank();
		
		//private 접근제한자 붙은 필드는
		//바로 접근하지 못함! -> 기능을 사용해서 값 변경
		//pb.money = 10000000;
		
		pb.deposit(1000);
		pb.showMoney();
		System.out.println("===========================");
		pb.withdraw(600);
		pb.showMoney();
		System.out.println("===========================");
		pb.withdraw(1000);
		pb.showMoney();
		
	}
}

public class PiggyBank {
	//속성 : 금액
	//private : 현재 클래스(객체)내에서만 접근가능하도록
	private int money;
	
	//기능(메서드)
	//1. 돈을 넣는다
	public void deposit(int money) {
		//this : 현재 생성된 인스턴스에 접근
		this.money += money;
	}
	//2. 돈을 인출한다
	public void withdraw(int money) {
		if(money <= this.money) {
			this.money -= money;			
		}else {
			System.out.println("잔액이 부족합니다");
		}
	}
	//3. 잔액을 보여준다
	public void showMoney() {
		System.out.println("현재 잔액 : "+ money);
	}
}


생성자

생성자의 특징

- 생성자는 메소드이다
- 생성자 이름은 클래스 이름과 동일
- 생성자는 리턴 타입을 지정할 수 없다
- 생성자는 new를 통해 객체를 생성할 때만 호출됨
- 생성자는 하나 이상 선언되어야
=> 개발자가 생성자를 정의하지 않으면(자동으로) 기본 생성자가 정의됨
> 컴파일러에 의해 자동 생성
> 기본 생성자를 디폴트 생성자(default constructor)라고도 함
> 만약 default 생성자만 존재하고 default에 아무런 기능이 없을 경우 생략이 가능함

생성자 오버로딩

- 생성자의 이름이 같다
- 매개변수의 타입, 개수 다르다
- 클래스에 생성자가 하나라도 존재하면 자동으로 기본 생성자가 생성되지 않음

예제
Person 클래스 작성
Person클래스의 필드
접근 지정자 타입 변수명 설명
private String name 학생 이름
private int age 나이

Person클래스의 메소드
이름 리턴 타입 매개변수 설명
Person X - default생성자로 아무런 기능을 수행하지 않는 생성자
Person X String 변수 이름,
int 변수 이름
2개의 매개변수를 가진 생성자로서 객체 생성 시 name, age를 초기화
getName String - name을 리턴
setName void String 변수 이름 name에 값 저장
getAge int - age를 리턴
setAge void int 변수 이름 age에 값 저장
더보기
package 생성자;

public class Person {

	//필드 : 이름, 나이
	private String name;
	private int age;
	
	public Person() {} //기본생성자 구조
	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}
	public void setName(String name) {
		this.name = name;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public int getAge() {
		return age;
	}
}

Main클래스 작성
- 먼저 Person의 default생성자를 이용해 객체 person1을 생성하세요.
- person1 객체에 들어있는 자신의 이름과 나이로 name, age를 초기화하세요.
- 2개의 매개변수를 넘겨받는 생성자를 이용해 짝꿍의 이름과 나이로 객체 person2를 생성하세요.
- 두 사람 객체의 이름과 나이를 아래와 같이 출력하세요.
더보기
package 생성자;

public class PersonMain {
	public static void main(String[] args) {
		Person person1 = new Person();
		Person person2 = new Person("헌찬김", 17);
		
		person1.setName("김헌찬");
		person1.setAge(27);
		
		System.out.println("학생 이름 : " + person1.getName() + ", 나이 : " + person1.getAge());
		System.out.println("학생 이름 : " + person2.getName() + ", 나이 : " + person2.getAge());
	}
}

예제
Calculator 클래스 작성
Calculator클래스의 필드
접근 지정자 타입 변수명 설명
private int num1 첫 번째 정수
private int num2 두 번째 정수
더보기
package 생성자;

public class Calculator {
	private int num1;
	private int num2;
	
	public Calculator(int num1, int num2) {
		this.num1 = num1;
		this.num2 = num2;
	}
	
	public void setNum1(int num1) {
		this.num1 = num1;
	}
	public void setNum2(int num2) {
		this.num2 = num2;
	}
	
	public int sum() {
		return num1 + num2;
	}
	public int sub() {
		return num1 - num2;
	}
	public int mul() {
		return num1 * num2;
	}
	public double div() {
		return (double)num1 / num2;
	}
	
}


Main 클래스 작성
- 2개의 매개변수를 넘겨받는 생성자를 이용해 cal을 만드세요
- cal객체의 num1과 num2를 더한 값을 출력하세요
- cal객체의 num1값은 75, num2의 값은 5로 수정하세요
- cal객체의 num1과 num2를 뺀 값, 곱한 값, 나눈 값을 출력하세요

더보기
package 생성자;

public class CalculatorMain {
	public static void main(String[] args) {	
		Calculator cal = new Calculator(15, 5);
		System.out.println("num1 + num2 = " + cal.sum());
		
		cal.setNum1(75);
		cal.setNum2(5);
		System.out.println("num1 - num2 = " + cal.sub());
		System.out.println("num1 * num2 = " + cal.mul());
		System.out.println("num1 / num2 = " + cal.div());
	}
}

728x90

'JAVA' 카테고리의 다른 글

Java 객체 배열  (0) 2022.01.13
Java 메소드(Method)  (0) 2022.01.13
Java 배열  (0) 2022.01.13
Java 반복문  (0) 2022.01.13
Java 조건문  (0) 2022.01.12
Comments