본문 바로가기

Java/이론 정리

[JAVA SE – 객체지향 및 기본 정의 살펴보기]

Java 1주차(2010.3.2~3.5)

 

>> 객체 지향 프로그래밍(Object Oriented Programming, OOP)

 

  • 특징

절차지향 프로그래밍이(Sequence, Flow)기반이라면 객체 지향은 특정 이벤트들에 대해서 누가(Who?!)가 더 중요하다. OOP는 절차지향에 비해 설계(=Coding)하기는 힘들지만 유지보수 및 재사용성, 그리고 확장성에서 절차지향보다 우수하기에 효율적이다.

 

  • 객체 = 프로그램을 실행하는 하나 하나의 주체.

Attribute(속성) + Operation(동작)으로 이루어진다.

 

Attribute

: 객체가 가지고 있는 Data

Operation

: 객체가 가지는 기능(Fuction)

 

  • 클래스 = 서로 다른 객체들의 공통적인 속성(Attribute)동작(Operation)을 뽑아 이를 하나로 묶어주는 개념.

 

간단히 큰 가닥 잡기 <1>

Java에서는 Object & Instance라는 용어로 객체를 일컫기도 한다.

(단, 범용적인 객체들을 일컬을 때는 Object, 클래스에서 하나하나 만들어낸 객체의 경우 Instance라는 용어를 주로 쓴다.)

Attribute : Instance Member variable

Operation : Instance Member Method(기능적인 동작 구현) & Constructor

 

Class 생성하기

[제한자=modifier] class (클래스 이름= 식별자 Identifier) //선언부

{

Attribute (<=객체의 실지 Data값들이 저장되어질 저장소의 개념)

(Instance Member Varialbe은 클래스의 구현부에서 써야하며 크게 방법은 2가지가 존재한다.)

 

(방법1)

선언을 통해 저장소를 만드는 작업을 한다. 이 때 선언시의 문법은 아래와 같다.

값을 할당연산자를 사용하여 값을 대입한다.

 

[제한자] DataType 변수이름(=식별자);

변수이름(식별자) = (입력하고자 하는)값

 

(방법2)

DataType 변수명 = (입력하고자 하는)값

Operation

  • Method와 Constructor로 이루어진다. Method는 다시 (Instance Member & Class Member) Method로 나뉠 수 있다. Instance Member Method는 객체의 기능(=동작)을 구현한다.
  • Method는 다른 무엇인가(ex. 객체)의 호출(=Call)을 받아 실행되어진다.
  • Operation은 호출하는 쪽(=Caller Method)와 호출 당해서 일하는 쪽(=Worker Method)으로 나뉠 수 있다. Worker가 자신이 할 수 있는, 해야하는 일들을 선언해 놓으면, Caller가 이를 기반으로 Worker에게 일을 시킨다. Worker는 절대 자기 스스로 할 일을 생각하여 할 수 없고, Caller의 호출이 있을 시에만 일을 할 수 있다. 또한 Caller는 Worker를 호출시 Worker가 해야할 일(Argument 내지는 Parameter)을 같이 넘겨주어야 하며, Worker가 작업을 끝냈을 때 Caller에게 다시 반환값(=Return Data Value)을 가질 수도, 안 가질 수도 있다.

     

    Caller ------>(parameter) ------>Worker ----> [Return Value]----->Caller

  • 형식

     

[제한자] Return type Method이름(=식별자) ([Argument List])

 

이때 반환해줄 데이터가 없을 시에는 'void'로 쓴다. 그리고 Method의 이름, 즉 식별자의 명명규칙은 첫 글자를 소문자로 쓰고, 단어가 합성 되어질 때에는 둘째 단어부터 첫 글자들은 대문자로 지정한다.

 

 

간단한 예제파일 살펴보기

 

Student <클래스 이름>

Name String < 어트리뷰트 식별자명 / 데이터타입>

Age int

Address String

Num int

schoolName String

Study(subject string) < Method명 (Argument(=Parameter) DataType ) >

Test(subject string):int UML 표기법에서는 ' : ' 표시는 반환값으로 뒤에 반환할 데이터타입을 표시한다. 코딩에서는 int Test(string subject)가 되는 것이다

위의 UML을 코딩으로 구현하면

 

class Student{ //Student 클래스 선언

 

String name;

int age;

String address;

int num;

String schoolName;

//Attribute 종료

 

void study(String subject){

System.out.println("당신이 공부해야 할 과목은 " + subject);

}

int test(String subject){

System.out.println("당신이 시험 쳐야 할 과목은 " + subject );

return 10;

}//Method 종료

}//Student 클래스 종료

 

위 단계가 클래스를 생성한 것이다. 컴파일을 실행해보면 잘 되어지는 것을 알 수 있으나, JVM으로 interpreting을 해보면

 

Exception in thread "main" java.lang.NoSuchMethodError: main

 

이라는 오류 Message를 확인할 수 있다. 이와 관련하여 밑에서 다시 살펴보면, 부과적으로 위의 작업들은 클래스만을 생성하였을 뿐, 객체가 빠져있다. 즉, 붕어빵틀은 있지만 붕어빵 재료들이 없기 때문에 이 역시 실행될 수 없다.

 

쉬어가기 <2> - 식별자 명명(Namming) 규칙

  • 알파벳문자, 숫자, '_(=UnderBar)', ''$'만 사용가능
  • 숫자는 두 번째 글자부터 가능.(ex 1a,3b는 안되고, a1,b3는 가능)
  • 대소문자를 구별한다.
  • Keyword(예약어)는 식별자가 될 수 없다.
  • 식별자의 길이는 제한이 없다.(=무한대의 길이로 명명이 가능하다.)
  • 관례적으로 클래스의 식별자의 첫 글자는 대문자를 사용하며, 여러 단어가 합쳐질 때는 단어별 첫 글자를 대문자로 표기한다.

 

 

용어정리

  1. Variable

변수(Variable) : 값을 저장하는 장소. X=10, x=5, x=2 à 상수값 10,5,2는 불변이고, 이들 숫자가 저장되는 'x'라는 저장소의 값이 변하는 것이다. 변수를 사용하는 이유는 재사용성이 가장 크다. 가령 숫자 '10'이라는 Data를 그냥 사용할 경우 이 숫자 데이터가 필요할 때마다 매번 10을 만들어 써야 하지만, '10'을 변수 x에 넣게 되면 매번 x를 호출하여 사용하면 된다.

 

  • 종류)

 

Local

: Method 안에서만 동작 (지역변수)

Instance

: Attribute로서 사용되는 변수

Class

: 객체가 아닌 클래스에 소속된 변수

 

  1. Main Method

point Method of Java Application

 

  • 구문)

public static void main(String[] args)

위 구문에서 변경 가능한 부분은 'args' 이고, 나머진 고정적으로 사용되어야 한다.

 

  1. 제한자(=Modifier)

    생성되어질 클래스의 기능에 제한을 두거나 설명을 할 때 사용된다.

 

예제로 풀어보는 시간

 

Student.java

class Student{ //Student 클래스 선언

 

String name;

int age;

String address;

int num;

String schoolName; //Attribute 선언 종료

 

void study(String subject){

System.out.println("당신이 공부해야 할 과목은 " + subject);

}

 

int test(String subject){

System.out.println("당신이 시험쳐야할 과목은 " + subject );

return 10;

}//Method 종료

}//Student 클래스 종료

StudentDemo.java

class StudentDemo{

public static void main(String[] args){

 

//Student의 객체 생성 및 stu에 할당

 

// 방법1

Student stu = new Student();

 

//이름과 나이 할당하기

stu.name="홍길동";

stu.age=20;

 

//이름과 나이 출력하기

System.out.println("당신의 이름은 " + stu.name+"입니다");

System.out.println("당신의 나이는 " + stu.age+"세 입니다");

 

//test() 호출

int grade = stu.test("국어");

 

System.out.println("점수 : "+grade);

}

}

출력결과

 

>> Constructor

  • 객체가 생성될 때 호출되는 것.
  • 객체 성성시에만 호출되는 동작(=Operation)
  • 주 업무는 Attribute(=속성)값 초기화 작업
  • Return type이 없고, 이름은 Class과 동일하다
  • 사용자가 생성자를 명시적으로 생성하지 않으면 Compiler가 Compile시에 자동적으로 생성된다. 이를 Default Constructor 이라 한다. 이 경우 Argument가 없고, 제한자 public의 성질을 가지며 하는 일이 없다.

 

  • 구문

[제한자] Class이름 ([argument list]){

실행구문

}

 

객체 생성시 Attribute 초기화 3단계

  1. Default 초기화(=묵시적 초기화)

    각 Type의 Default 값이 할당된다.

    Ex) String 타입(=참조 데이터타입)의 경우 Default값이 Null이므로 Null이 우선 들어가는 것이고, 의미는 '아무 객체도 참조하지 않는다'이다.

정수형 데이터타입은 (Int 타입의 경우) Default값이 0 이므로 JVM이 자동으로 0을 할당.

실수형은 0.0이고, 문자형(char)는 '\u0000'(<-공백을 의미) 이고, boolean형은 false이다.

 

  1. 명시적 초기화

    Code에서 할당한 값이 할당된다.

    Ex) String name ;

    int age= 20;

    라는 code가 있다면 name에는 디폴트 초기화에서 생성된 null값을 가지고, age에는 명시적 초기화에 의해 20이 할당된다.

     

  2. 생성자 수행에 의한 초기화

    Ex) Student stu1=new Student("이름",20);

    위 코드 중 argument의 값이 생성자에 의해서 들어가는 값이 최종적으로 들어가게 된다.

 

 

>> Data Type (데이터의 형태와 크기에 따른 분류)

기본 DataType

(=Primitive)

Boolean

논리형

   

Char

문자형

2byte

표현은 ' ' 으로~

Ex) 'A' 나 '/u54(2)'

즉 '\u'를 붙이고 대응글자의 유니코드숫자를 입력해도 된다.

 

Byte

정수형

2^8

-2^7 ~ 2^7-1

 

Short

2^16

  

Int

2^32

 

Default

Long

2^64

  

Float

실수형

2^32

  

Double

2^64

Ex)5e20=5.0 x 10^20

Ex2) 2.14e12=2.14x10^12

Default

사용자 정의

DataType

Reference Data Type

Class 나 Object가 이에 해당.

Ex)Student stu=new Student)();

참조변수에 대한 개념 잡기!

 

참고

문자열을 저장하는 String의 데이터 타입은 사용자정의 타입으로 Class라 할 수 있다. 즉 참조 데이터 타입에 속한다. 헌데, 클래스라면 new 를 사용해 객체를 생성해서 값을 변수에 할당해야 하지만 code에 워낙 빈도가 많기에 예외로 new 연산자를 사용하지 않아도 되는 것이다. Java 1.6이전에는 유일한 예외였지만, 1.6에 들어서며 8가지가 더 생겼다. 표기법은 " "에 넣는다. String str= " 표현할 문자열 " 이고

하나의 더 예를 들어 "A"+10 을 출력하면 A10이 출력되는데 이는 뒤의 숫자 10이 문자로 변형되어지는 것이다.

 

논리형 boolean의 경우 참(true), 거짓(false)를 나누는 것인데, C언어와 같은 언어에서는 참(1),거짓(0)으로 표현할 수도 있지만, 자바는 오로지 참의 값은 true라는 키워드, 거짓은 false 라는 키워드만 가능하다!

Ex ) Boolean b= false;

 

 

>>형변환(Type Casting)

 

Case-1)

int A=10 이고, double B=50.3

A+B= 60.3

위와 같이 서로 다른 Data Type사이의 연산이 가능한 것은 int형 데이터 10을 double형 10.0으로 변환하여 더하기 때문이다. 일반적으로는 두 타입 중 작은 타입을 큰 타입의 데이터 타입으로 JVM이 자동으로 형변환(묵시적 형변환)을 수행되기 때문이다.

 

하지만, 위의 경우와 반대로 큰 데이터타입을 작은 데이터타입으로 맞추어주기 위해서는 수동적으로 코딩이 필요하다.

 

EX)

Int i=32768L; 을 수행하기 위해서는 i의 데이터 타입을 변경하긴 힘들고, 32768L을 변경해야 하는데, 이 경우 데이터의 값이 변경될 수 있는 위험의 소지가 발생한다. 그렇기에 컴파일러는 구문체크에 이어 Type Check시에 이 문제를 발견하여 Error를 도출한다. 이러한 문제를 프로그래머가 데이터의 값이 변환되는 것을 감수하고서라도 해결하기 위해서는

Int i=(int)32768L;과 같이 변환할 값의 앞에 변환되어질 데이터타입을 지정해주면 된다. 이러한 방법을 명시적 형변환이라 한다.(필드에선 거~진 쓰지 않는 이론적 기능이다, 그럼에도 불구하고 이를 쓰는 이유는 기본형 데이터 타입에서가 아닌 사용자 데이터 타입에서 매우 중요하게 쓰이는 것이다. 이는 추후 살펴볼 다형성에서 중요하므로 기억하자!)

 

(**Boolean 타입은 형변환이 원천적으로 불가능하다. 그리고 기본 타입과 사용자 정의 타입간의 형변환도 불가능하다.)