[Java]Class(1)

박진우·2022년 9월 7일
0

[Java]자바의 기초

목록 보기
6/16

객체 지향 프로그래밍

객체 지향 프로그래밍 탄생 배경

소프트웨어의 생산성 향상
• 컴퓨터 산업 발젂에 따라 소프트웨어의 생명 주기(life cycle) 단축
• 객체 지향 언어는 상속, 다형성, 객체, 캡슐화 등 소프트웨어 재사용을 위핚
여러 장치 내장
프로그래밍 응용 분야
• 과거 : 수학 계산/통계 처리를 하는 등의 처리 과정, 계산 젃차가 중요
• 현재 : 컴퓨터가 산업 젂반에 홗용, 실세계에서 발생하는 일을 프로그래밍
실세계의 일을 보다 쉽게 프로그래밍하기 위핚 객체 중심의 객체 지향 언어 탄생하게 됨
• 실세계에서는 젃차나 과정보다 일과 관렦된 물체(객체)들의 상호 작용으로
묘사하는 것이 용이

절차지향 프로그래밍과 객체 지향 프로그래밍

절차 지향 프로그래밍
• 작업 순서를 표현하는 컴퓨터 명령 집합
• 함수들의 집합으로 프로그램 작성
객체 지향 프로그래밍
• 프로그램을 실제 세상에 가깝게 모델링
• 컴퓨터가 수행하는 작업을 객체들 갂의 상호 작용으로 표현
• 클래스(혹은 객체)들의 집합으로 프로그램 작성

절차지향 프로그래밍과 객체 지향 프로그래밍 예시

객체 지향 프로그래밍

OOP: Object Oriented Programming

부품 객체를 먼저 맊들고 이것들을 하나씩 조립해 완성된 프로그램을 만드는 기법

객체(Object)란?
물리적으로 존재하는 것 (자동차, 책, 사람)
추상적인 것(회사, 날짜) 중에서 자싞의 속성과 동작을 가지는 모든 것
객체는 필드(속성) 과 메소드(동작)로 구성된 자바 객체로 모델링 가능

객체의 상호 작용

객체들은 서로 간에 기능(동작)을 이용하고 데이터를 주고 받음

객체간의 관계

객체 지향 프로그램에서는 객체는 다른 객체와 관계를 맺음

관계의 종류

• 집합 관계: 완성품과 부품의 관계
• 사용 관계: 객체가 다른 객체를 사용하는 관계
• 상속 관계: 종류 객체와 구체적인 사물 객체 관계

객체 지향 프로그래밍의 특징

캡슐화

• 객체의 필드, 메소드를 하나로 묶고, 실제 구현 내용을 감추는 것
• 외부 객체는 객체 내부 구조를 알지 못하며 객체가 노출해 제공하는 필드와 메소드만 이용 가능
• 필드와 메소드를 캡슐화하여 보호하는 이유는 외부의 잘못된 사용으로 인해 객체가 손상되지 않도록
• 자바 언어는 캡슐화된 멤버를 노출시킬 것인지 숨길 것인지 결정하기 위해 접근
제한자(Access Modifier) 사용

상속

• 상위(부모) 객체의 필드와 메소드를 하위(자식) 객체에게 물려주는 행위
• 하위 객체는 상위 객체를 확장해서 추가적인 필드와 메소드를 가질 수 있음
• 상속 대상: 필드와 메소드
• 상속의 효과
1. 상위 객체를 재사용해서 하위 객체를 빨리 개발 가능
2. 반복된 코드의 중복을 줄임
3. 유지 보수의 편리성 제공
4. 객체의 다형성 구현

상속

다형성 (Polymorphism)

• 동일핚 이름의 기능이 서로 다르게 작동하는 현상
• 자바의 다형성 사례
– 슈퍼클래스 메소드를 서브클래스마다 다르게 구현하는 메소드 오버라이딩
– 핚 클래스 내에 구현된 동일핚 이름이지맊 다르게 작동하는 여러 메소드
• 같은 타입이지맊 실행 결과가 다양핚 객체를 대입핛 수 있는 성질
– 부모 타입에는 모든 자식 객체가 대입
– 인터페이스 타입에는 모든 구현 객체가 대입
• 효과
– 객체를 부품화시키는 것 가능
– 유지보수 용이

객체(Object)와 클래스(Class)

현실세계: 설계도 -> 객체
자바: 클래스 -> 객체
클래스에는 객체를 생성하기 위핚 필드와 메소드가 정의
클래스로부터 맊들어짂 객체를 해당 클래스의 인스턴스(instance)
하나의 클래스로부터 여러 개의 인스턴스를 맊들 수 있음

클래스(Class)

객체의 속성과 행위 선언
객체의 설계도 혹은 틀

객체(Object)

클래스의 틀로 찍어낸 실체
• 메모리 공갂을 갖는 구체적인 실체
• 클래스를 구체화핚 객체를 인스턴스(instance)라고 부름
• 객체와 인스턴스는 같은 뜻으로 사용

사례

클래스: 소나타자동차, 객체: 출고된 실제 소나타 100대
클래스: 벽시계, 객체: 우리집 벽에 걸린 벽시계들
클래스: 책상, 객체: 우리가 사용중인 실제 책상들

클래스(Class) 구성

클래스의 구성 멤버

class 이름 : Circle (첫글자를 대문자)
1. field (속성) : radius
2. constructor(생성자) : Circle(), Circle(double newRadius)
- 생성자의 이름과 class이름은 동일함
- 생성자는 특수한 경우에 사용하는 method
(생성자는 new Circle()같은 방식으로 힙메모리에 인스턴스 만들 때 Java내부적으로 오직 1번만 실행)
- 생성자 overloading : method overloading과 같은 개념
- class내에 생성자는 여러개 만들어 질 수 있음
3. class method : getArea(), getPerimeter(), setRadius(double newRadius)

public class Circle {
	double radius = 1;
	
	public Circle() {
		System.out.println("Circle default constructor 호출");
	}

	public Circle(double newRadius) {
		System.out.println("Circle(double newRadius) constructor 호출");
		radius = newRadius;
	}

	// 원의 면적 구하는 method 선언
	public double getArea() {
		return radius*radius*Math.PI;
	}
	
	// 원의 둘레 구하는 method 선언
	public double getPerimeter() {
		return 2*Math.PI*radius;
	}
	
	public void setRadius(double newRadius) {
		radius = newRadius;
	}
	
}

클래스 호출

  1. Circle c 의미
  • Circle : class이름이면서 data type
  • Circle class내부에는 field인 radius가 있고 method인 getArea, getPerimeter, setRadius 존재
  • c, c2 : Circle 인스턴스(instance)/Object를 가리키는 변수
  1. new Circle() 명령어의 기계어들로 변환시 실행 순서
    1) new를 실행 : heap memory에 Circle class의 인스턴스를 만들고, 인스턴스의 힙메모리 주소를 갖고 있음
    . instance 안에는 field들만 갖고 있음 (즉 radius field만 갖고 있음), 메소드는 힙메모리에 없음
    2) Circle class의 생성자(constructor) method인 public Circle()을 실행함
    => heap memory의 주소를 class내에 this라는 변수이름으로 전달 (this : Java내부에서 관리되는 이름)
    3) heap memory에서 생성된 인스턴스 주소를 stack memory에 있는 변수 c에 넣어줌
  2. Circle class의 인스턴스인 c, c2를 사용하여 Circle class의 field와 method를 사용
public class TestCircle {

	public static void main(String[] args) {
		Circle c = new Circle();
		
		System.out.println("Circle class 객체(인스턴스)인 c의 반지름 : " + c.radius);
		System.out.println("Circle class 객체인 c의 면적 : " + c.getArea());
		System.out.println("Circle class 객체인 c의 둘레 : " + c.getPerimeter());
    	}

}
		

클래스 내부의 메소드

class내에서 method가 다른 method를 직접 호출하여 사용할 수 있음
=> this. 을 붙여서 사용 가능
class의 method를 사용할려면 new로 heap memory instance 먼저 생성한 후 사용

public class Computer {
	int sum;
	
	public int sum1(int[] values) {
		
		this.beforeNotice();
		
		for (int i=0; i<values.length; i++) {
			this.sum += values[i];
		}
		
		return this.sum;
	}

	public int sum2(int... values) {
	//(int... values) => 가변인자를 사용하면 동적으로 파라미터를 받을수 있음	
    //파라미터와 가변인자를 같이 사용하는 경우에는 가변인자를 제일 뒤에 위치 시켜야 한다. 
		this.beforeNotice();
		
		for (int i=0; i<values.length; i++) {
			this.sum += values[i];
		}
		
		return this.sum;
	}
	
	public void beforeNotice() {
		this.sum = 0;
		System.out.println("합계 계산을 시작합니다.");
	}
}
public class ComputerEx {

	public static void main(String[] args) {
		Computer myCom = new Computer();
		
		int[] values = {1,2,3};
		int sum = myCom.sum1(values);
		System.out.println("sum : " + sum);

        sum = myCom.sum2(new int[] {1,2,3,4,5});
		System.out.println("sum : " + sum);
	}

}

강의를 들은후 느낀점

이론적인 부분이 많아 굉장히 지루했었다. 하지만 자바의 특징 3개는 굉장히 중요하다고 생각해 이론적인 부분을 더 많이 포스팅 했다.
다음 포스팅은 오늘 포스팅 이외의 클래스들을 쓸 예정이다.

profile
개발자를 꿈꾸는 사람입니다

0개의 댓글