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) 선언을 통해 저장소를 만드는 작업을 한다. 이 때 선언시의 문법은 아래와 같다. 값을 할당연산자를 사용하여 값을 대입한다.
(방법2)
| ||
Operation
이때 반환해줄 데이터가 없을 시에는 'void'로 쓴다. 그리고 Method의 이름, 즉 식별자의 명명규칙은 첫 글자를 소문자로 쓰고, 단어가 합성 되어질 때에는 둘째 단어부터 첫 글자들은 대문자로 지정한다. |
간단한 예제파일 살펴보기 | |||
| |||
위의 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) 규칙 |
|
용어정리 | |||||||
변수(Variable) : 값을 저장하는 장소. X=10, x=5, x=2 à 상수값 10,5,2는 불변이고, 이들 숫자가 저장되는 'x'라는 저장소의 값이 변하는 것이다. 변수를 사용하는 이유는 재사용성이 가장 크다. 가령 숫자 '10'이라는 Data를 그냥 사용할 경우 이 숫자 데이터가 필요할 때마다 매번 10을 만들어 써야 하지만, '10'을 변수 x에 넣게 되면 매번 x를 호출하여 사용하면 된다.
point Method of Java Application
위 구문에서 변경 가능한 부분은 'args' 이고, 나머진 고정적으로 사용되어야 한다.
|
예제로 풀어보는 시간
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단계 |
정수형 데이터타입은 (Int 타입의 경우) Default값이 0 이므로 JVM이 자동으로 0을 할당. 실수형은 0.0이고, 문자형(char)는 '\u0000'(<-공백을 의미) 이고, boolean형은 false이다.
|
>> 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 타입은 형변환이 원천적으로 불가능하다. 그리고 기본 타입과 사용자 정의 타입간의 형변환도 불가능하다.)
'Java > 이론 정리' 카테고리의 다른 글
Tomcat 설치 및 간단한 환경설정 (0) | 2010.07.12 |
---|---|
[JAVA SE – API _ 클래스변수와 클래스메소드 _ Singleton Pattern _ 상속 _ super _ 다형성 살펴보기] (0) | 2010.07.10 |
[JAVA SE – 반복&제어문 / 메소드와 변수의 범위 / 배열(Array) / Package / Method Overriding 살펴보기] (0) | 2010.07.10 |