객체지향 프로그래밍(1)

hyunn·2021년 7월 26일
0

Java-basic

목록 보기
16/26
post-thumbnail

객체지향 프로그래밍

객체지향언어

기본 개념

실제 세계는 사물(객체)로 이루어져 있으며, 발생하는 모든 사건들은 객체간의 상호작용이다.

기존의 프로그래밍 언어와 전혀 다른 새로운 것이 아니라 기존에서 발전된 형태

코드 간에 서로 관계를 맺어주어 유기적인 프로그래밍 가능


객체지향언어 특징


1. 재사용성 높음
2. 관리가 용이
3. 신뢰성 높음



클래스와 객체

클래스

객체를 정의해놓은 것, 객체 생성에 이용

객체

실존하는 사물이나 개념, 객체의 기능과 속성 따라 용도 다름

프로그래밍에서의 객체 : 클래스에 정의된 내용에 따라 메모리에 생성된 것

클래스는 설계도, 객체는 그 설계도에 따라 생성된 결과물이라고도 할 수 있음

인스턴스

클래스에서 객체를 만드는 과정 = 인스턴스화

인스턴스 = 어떤 클래스로부터 만들어진 객체

클래스 ─ 인스턴스화 ─> 인스턴스(객체)

속성과 기능

객체가 가진 속성과 기능 = 그 객체의 멤버

속성 = 멤버변수 variable = 특성 = 필드 = 상태

기능 = 메서드 method = 함수 function = 행위

인스턴스 생성

클래스명 변수명;			//클래스 객체 참조위해 참조변수 선언
변수명 = new 클래스명();		//객체 생성 후, 객체 주소를 참조변수에 저장

Test t;				//Test클래스 타입의 참조변수 t 선언
t = new Test();			//Test인스턴스 생성 후, 생성된 인스턴스 주소를 t에 저장

인스턴스는 참조변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치해야한다.

객체 배열

많은 수의 객체를 다뤄야할 때 사용

배열 내에 객체가 저장되는 것XX

객체의 주소 를 저장

객체배열도 같은 타입의 객체만 저장 가능

Test t1, t2, t3;

Test[] testArr = new Test[3];	//참조변수 배열 생성

//객체 생성해서 배열의 각 요소에 저장
testArr[0] = new Test();
testArr[1] = new Test();
testArr[2] = new Test();

//배열 초기화 블럭 사용해 한 줄로 정리
Test[] testArr = { new Test(), new Test(), new Test() };

//다룰 객체 수가 많을 때는 for문 사용
Test[] testArr = new Test[100];
for(int i = 0; i < testArr.length; i++) {
    testArr[i] = new Test();
}

프로그래밍 관점에서 클래스

변수 - 하나의 데이터를 저장할 수 있는 공간

배열 - 같은 종류의 여러 데이터를 하나의 집합으로 저장할 수 있는 공간

구조체 - 서로 관련된 여러 데이터를 타입 관계없이 하나의 집합으로 저장할 수 있는 공간

클래스 - 데이터와 함수의 결합 (구조체 + 함수)

외에 사용자 정의 타입 클래스도 있음

프로그래머가 서로 관련된 변수들을 묶어 하나의 타입으로 새로 추가하는 것



변수

선언 위치 따른 변수 종류

변수 - 클래스변수, 인스턴스 변수, 지역 변수

지역변수 - 멤버변수를 제외한 나머지. 변수 선언문이 수행되었을 때 생성

클래스변수 - 멤버변수 중 static이 붙은 것. 클래스가 메모리에 올라갔을 때 생성

인스턴스 변수 - 붙지않은것. 인스턴스가 생성되었을때 생성

//클래스영역
class Variables {
  int iv;		//인스턴스 변수
  static int cv;	// 클래스변수(static변수)
  
  //메서드영역
  void method() {
    int lv = 0;		//지역변수
  }
}

인스턴스 변수 instance variable

클래스 영역에 선언

클래스의 인스턴스를 생성할 때 만들어짐

인스턴스마다 고유의 상태를 유지해야하는 속성은 인스턴스 변수로 선언

클래스 변수 class variable

인스턴스 변수 앞에 static이 붙은 것

모든 인스턴스가 공통된 저장공간 공유

한 클래스의 모든 인스턴스가 공통된 값 유지해아하는 속성은 클래스변수로 선언

//클래스이름.클래스변수 로 사용
Variable.cv;

//public 붙이면 전역변수의 성격을 가짐
public static int cv;

지역변수 local variable

메서드 내에 선언되어 그 메서드 내에서만 사용 가능

메서드 종료 시 소멸

for, while문 내에 선언된 변수도 해당 블럭 내에서만 사용 가능



메서드

특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것

장점

1. 높은 재사용성

여러번 호출 가능, 다른 프로그램에서도 사용 가능

2. 중복된 코드 제거

여러곳에서 반복되는 중복코드를 하나의 메서드로 대체

수정시 메서드만 수정하면 모든 곳에서 수정되므로 유지보수도 간편해짐

3. 프로그램의 구조화

프로그램의 전체 흐름이 한 눈에 들어오도록 단순하게 구조화하는 것이 좋음

설계시 내용이 없는 메서드를 작업단위로 만들어두고 하나씩 완성하는 것도 좋은 방법

선언과 구현

메서드 - 선언 header / 구현 body

반환타입 메서드명 (매개변수) {
  //호출시 수행될 코드
}

int add(int a, int b) { //선언부
  int result = a + b; //구현부
  result result;  //호출한 메서드로 결과 반환
}

선언부

메서드명, 매개변수 선언, 반환타입으로 구성

선언부 변경 시 해당 메서드가 호출되는 모든 곳을 수정해야함

선언

작업에 필요한 값 입력받는 것

각 변수 구분은 쉼표, 사용. 두 변수 타입 같아도 생략불가

int add(int x, int y) {...} //OK

int add(int x, y) {...} //XXXX 에러발생

메서드명

변수 명명규칙대로 작성

특정 작업 수행을 위한것이므로 보통 동사형태 많이 사용

함축적이면서 의미있는 이름으로 짓도록 노력해야함

반환타입

메서드 출력결과인 반환값의 타입

반환값 없을 경우 - void

구현부

선언부 뒤에 오는 {} 내의 코드

메서드 호출 시 수행될 문장들 해당

return문

반환타입이 void가 아닌경우 구현부 내에 return 반환값; 필수

반환타입과 일치하거나 자동 형변환이 가능한 타입이여야함

매개변수는 여러개여도 반환값은 단 하나만 가능

지역변수

메서드 내에 선언되어 해당 메서드에서만 사용가능한 변수

int add(int x, int y) {
  int result = x + y;
  return result;
}

int multifly(int x, int y) {
  int result = x * y;
  return result;
}

위의 코드에서 두 메서드에 각각 선언된 x, y, result 변수는 이름만 같고 모두 다른 변수

호출

구현부의 코드를 수행시키려면 메서드를 호출해야함

메서드명(1,2, ...);

int sum = add(2,3);

add(2,3;)

인자와 매개변수

인자 Argument

메서드 호출시 괄호() 내에 지정해준 값 = 인수

인자의 개수와 순서는 메서드 매개변수와 일치해야함

실행흐름

같은 클래스 내의 메서드끼리는 참조변수를 사용하지 않아도 서로 호출 가능

static메서드는 같은 클래스 내의 인스턴스 메서드 호출 불가 => new 이용

class MyMath {
  long add(long a, long b) {
    return a + b;
  }
  long subtract(long a, long b) { return a - b; }
  long multifly(long a, long b) { return a * b; }
  long divide(long a, long b) { return a / b; }
}

//MyMath클래스에서 호출
MyMath mm = new MyMath();	//인스턴스 생성
long value = mm.add(1L, 2L);//메서드 호출

return문

현재 실행중인 메서드를 종료하고 호출한 위치로 돌아감

반환값 없어도 그냥 return; 사용가능

반환값이 없어서 void를 사용했을때 return 안써도 된 이유는 컴파일러가 자동으로 return; 추가해줬기때문

조건문 내에 return을 넣어도 됨

int divide(int a, int b) {
  if (a > b) {
    return a / b;	//두개의 return문 중 하나만 쓰면 return문이 실행될수도있고 안될 수도 있어서 에러발생
  } else {
    return b / a;
  }
}

반환값 return value

return문의 반환값 - 주로 변수

//변수가 아닌 수식도 사용 가능
return x + y;

//어려운 수식도 가능
int diff(int x, int y) {
    return abs(x-y);//두 값의 차를 절대값으로 반환
}

//조건연산자도 가능
int abs(int x) {
    return x>=0 ? x : -x ; //삼항연산자 참이면 x, 거짓이면 -x
}

유효성 검사

타입만 맞으면 아무거나 매개변수로 넘어오는게 가능

모든 경우의 수에 대비해야함

ex. 0으로 나누는 경우 ArithmeticException 발생 - > 예기치않게 프로그램 종료

float divide(int x, int y) {
//작업 수행 전에 나누는 수y가 0인지 확인
  if (y == 0) {
    System.out.println("0으로 나눌 수 없습니다.");
    return 0;
  }
  return x / (float)y;
}

0개의 댓글