Java 1주차
☞Main Focus Theme. | ☞OOP Main Concept |
1. object 2. object oriented programming (OOP) 3. object component 4. relation of object between class | 1. Encapsulation(캡슐화) 2. Inheritance(상속) 3. Polymorphism(다형성) |
☞객체 지향 프로그래밍(Object Oriented Programming, OOP)
- 특징
절차지향 프로그래밍이(Sequence, Flow)기반이라면 객체 지향은 특정 이벤트들에 대해서 누가!(Who?!)가 더 중요하다. OOP는 절차지향에 비해 설계(=Coding)하기는 힘들지만 유지보수 및 재사용성, 그리고 확장성에서 절차지향보다 우수하기에 효율적이다.
객체 = 프로그램을 실행하는 하나 하나의 주체.
Attribute(속성) + Operation(동작)
Attribute | 객체가 가지고 있는 Data |
Operation | 객체가 가지는 기능(Fuction) |
Ex) Computer
- Attribute (2.8Ghz, 3GB, 500G, 9500GT …..)
- Operation (영화보기, 웹서핑하기, 오락하기….)
클래스 =서로 다른 객체들의 공통적인 속성(Attribute)과 동작(Operation)을 뽑아 이를 하나로 묶어주는 개념.
간단히 큰 가닥 잡기 <1> |
자바에서는 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' 이고, 나머진 고정적으로 사용되어야 한다. Ex) public class student{} 일때, 이 Source File Name은 반드시 student 이어야만 한다.
|
예제로 풀어보는 시간
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();
// 방법2 // Student stu; // 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); } } |
출력결과 |
예제로 풀어보는 시간2
Customer.java | CustomerDemo.java |
class Customer //Customer 클래스 선언 { //Attribute 선언 String name; //고객명 String sex; //고객성별 String address; //고객주소 String goods; //고객이 팔거나/사거나/반품한 상품 int age; //고객나이 int count; //고객이 팔거나/사거나/반품한 상품의 개수
//Method 생성
String sell(String address, String name, int count, String goods) { System.out.println(address+"에 거주하시는 " +name+ "님께서는 " + count + "개의 " + goods + " 상품을 판매하셨습니다."); return "감사합니다"; }
void recall(String name, int count, String goods) { System.out.println(name+ " 님께서는 " + count + "개의 " + goods + " 상품을 반품하셨습니다."); } } | class CustomerDemo { public static void main(String[] args){ //생성자로 Heap 영역 확보 Customer userInfo = new Customer();
//사용자 정보 할당
userInfo.name="감자바"; userInfo.address="겁나라"; userInfo.age=30; userInfo.goods="커피자판기"; userInfo.count=2;
//위에서 입력한 사용자 정보 출력 System.out.println(userInfo.name+"님은" +userInfo.age+" 세 입니다");
//Costomer 클래스의 Sell 메소드에 argument (userInfo.address,userInfo.name,userInfo.count,userInfo.goods)를 넘겨 sell()를 실행한 후, 반환값을 user2에 할당. String user2 = userInfo.sell(userInfo.address,userInfo.name,userInfo.count,userInfo.goods);
//Sell 메소드 실행 후, 반환된 값을 화면에 출력. System.out.println("이용해 주셔서"+ user2);
userInfo.recall("나빠요", 12, "도서"); } } |
3월 5일
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이다.
|
P29 & Chapter 2 주석
/** */ 로 묶이는 것을 'Java doc' 주석이라 한다. 이렇게 사용하는 것을 추천한다. 매뉴얼을 만들 때 주로 사용한다. (=Javadoc.exe를 사용하면 위 주석블록을 *.html 문서로 만들어준다.) |
Data Type : 데이터의 형태와 크기에 따른 분류
기본 DataType(=Primitive) | Boolean | 논리형 | ||||
Char | 문자형 | 2byte Unicode를 지원하기 때문. | 표현은 ' ' 으로~ 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;
----------------------P 60 chapter 3 상수----------------------------
상수는 Literal pool라는 별도의 공간에 저장된다. 저장되어지는 이유는 가령 10+20+30이란 산술계산을 해야 한다면 10+20을 우선 계산할 동안 30이 다른 어느 영역에 저장되어져야만 하는 것 과 같다.
Study(10); 이란 Method를 실행한다고 할 때 Argument로 쓰인 '10'은 변수와 달리 재사용되어 질 수 없다.
형변환(Type Casting)
P67의 데이터형 크기간의 비교도 기억.
Ex) int형 데이터 10과 double 형 데이터 50.3을 더하면, 즉 ,10+ 50.3 = 60.3이 출력된다. 이게 가능한건 int형 데이터 10을 double형 10.0으로 변환하여 더하게 되는 것이다. 일반적으로는 두 타입 중 작은 타입을 큰 타입의 데이터 타입으로 형변환을 한 후, 계산하게 된다.
Long count1=10; 을 하게 되는 것을 보면, int형은 10을 Long 데이터 타입으로 바꾸는 게 맞다. 그래야만 '10'이란 데이터가 깨어지지 않고 제대로 보관되어지기 때문이다.
위 2경우 모두 JVM이 알아서 해주는 자동 형변환(=UP CASTING)이다.
하지만, 위의 경우와 반대로 큰 데이터타입을 작은 데이터타입으로 맞추어주기 위해서는 수동적으로 코딩이 필요하다.
EX)
Int i=32768L; 을 수행하기 위해서는 i의 데이터 타입을 변경하긴 힘들고, 32768L을 변경해야 하는데, 이 경우 데이터의 값이 변경될 수 있는 위험의 소지가 발생한다. 그렇기에 컴파일러는 구문체크에 이어 타입체크시에 이 문제를 발견하여 Error를 도출한다. 이러한 문제를 프로그래머가 데이터의 값이 변환되는 것을 감수하고서라도 해결하기 위해서는
Int i=(int)32768L;과 같이 변환할 값의 앞에 변환되어질 데이터타입을 지정해주면 된다. 이러한 방법을 명시적 형변환이라 한다.(필드에선 거~진 쓰지 않는 이론적 기능이다, 그럼에도 불구하고 이를 쓰는 이유는 기본형 데이터 타입에서가 아닌 사용자 데이터 타입에서 매우 중요하게 쓰이는 것이다. 이는 추후 살펴볼 다형성에서 중요하므로 기억하자!)
(**Boolean 타입은 형변환이 원천적으로 불가능하다. 그리고 기본 타입과 사용자 정의 타입간의 형변환도 불가능하다.)
'Java' 카테고리의 다른 글
PrintWriter Ex. Source (0) | 2010.04.01 |
---|---|
PrintWriter Ex. Source (0) | 2010.04.01 |
Data In/OutPut StreamTest (0) | 2010.03.31 |
File IO using Buffered IO Stream (0) | 2010.03.31 |
File I/O Ex. Source(2) (0) | 2010.03.31 |
File I/O Ex. Source(1) (0) | 2010.03.31 |
School_Collection_Ex (0) | 2010.03.30 |
HashMap Ex. Source(2) (0) | 2010.03.30 |
HashMap Ex. Source (0) | 2010.03.30 |
Collection FrameWork 中 MAP Ex. source (0) | 2010.03.30 |