본문 바로가기

Java

Java 1주차 간단 정리

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)

선언을 통해 저장소를 만드는 작업을 한다.

이 때 선언시의 문법은 아래와 같다.

 

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

 

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

 

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

 

(방법2)

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

 

간단히 큰 가닥 잡기 <2>

DataType은 크게 Java에서 미리 정의되어진 Primitive Type인 정수형, 실수형, 문자형, 부울형과Reference Type인 사용자정의 타입으로 나뉘어진다.

 

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) : 값을 저장하는 장소. 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' 이고, 나머진 고정적으로 사용되어야 한다.

Ex) public class student{} 일때, 이 Source File Name은 반드시 student 이어야만 한다.

 

  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();

        

        // 방법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단계

  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의 값이 생성자에 의해서 들어가는 값이 최종적으로 들어가게 된다.

 

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