객체란?

: 객체(Object)란 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있고 다른것과 식별 가능한 것을 말합니다.

객체는 속성과 동작으로 구성되어 있다고 보면 되는데 자바에서는 이 속성과 동작을 각각 필드(field) 와 메소드(method) 라 부릅니다.


현실세계의 객체를 소프트웨어 객체로 설계하는 것을 객체 모델링(Object Modeling)이라고 합니다. 객체 모델링은 현실 객체의 속성과 동작을 추려내서 소프트웨어 객체의 필드와 메소드로 정의하는 과정이라 할 수 있습니다.


[객체지향프로그래밍의 특징]

1. 캡슐화(Encapsulation)

: 캡슐화란 객체의 필드, 메소드를 하나로 묶고, 실제 구현 내용을 감추는 것을 말합니다.

외부 객체는 객체내부의 구조를 알지 못하며 객체가 노출해서 제공하는 필드와 메소드만 이용할 수 있습니다.


이렇게 캡슐화를 하는 이유는 외부의 잘못된 사용으로 인해 객체가 손상되지 않도록 하기 위함입니다.

자바언어는 캡슐화된 멤버를 노출시킬지, 숨길 것인지를 결정하기 위해

접근제한자를 사용합니다.

접근제한자는 객체의 필드와 메소드의 사용범위를 제한함으로써 외부로부터 보호합니다.


2. 상속(Inheritance)

: 상속이란 객체 지향 프로그래밍에서 부모역할의 상위객체가 자기가 가지고 있는 필드와 메소드를 자식역할의 하위 객체에게 물려주어 하위객체가 사용할 수 있도록 해주는 것입니다.


상속은 상위객체를 재사용함으로써 하위 객체를 쉽고 빨리 설계할 수 있도록 도와주고, 이미 잘 개발된 객체를 재사용해서 새로운 객체를 만들기 때문에 반복된 코드의 중복을 줄여줍니다.


3. 다형성(Polymorphism)

: 다형성은 같은 타입이지만 실행결과가 다양한 객체를 이용할 수 있는 성질을 말합니다. 코드 측면에서 보면 다형성은 하나의 타입에 여러 객체를 대입함으로써 다양한 기능을 이용할 수 잇게 해줍니다.



WRITTEN BY
SiriusJ

,

[배열 타입(Array Type)]


배열 선언

1) 타입[ ]   변수;

2) 타입   변수[ ];

와 같이 두가지 형태로 선언될 수 있습니다.


예)

(값 목록으로 배열 생성)

-> String[] name = {"최진우", "정보통신공학", "수원"};

(new 연산자로 배열 생성)

-> int[] age = null;

age = new int[5];

//길이가 5인 int형 배열 선언.


String값을 int형으로 변환

예) String name = "5";

int num = Integer.parseInt(name);

--> num을 출력으로 찍어보면 숫자 5가 출력됩니다.

이 때, name에는 정수로 변환할 수 있는 문자열만 주어져야 NumberFormatException(실행 예외)이 발생하지 않게 됩니다.



객체를 참조하는 배열

기본타입(Primitive Type - 8가지) 배열은 각 항목에 직접 값을 갖고있지만, 참조타입(클래스, 인터페이스) 배열은 각 항목에 객체의 번지를 가지고 있습니다.

예를 들어 String은 클래스 타입이므로 String[] 배열은 각 항목에 문자열이 아니라, String 객체의 주소를 가지고 있습니다.

예) String[] strArray = new String[3];

strArray[0] = "Java";

strArray[1] = "Python";

strArray[2] = "C";


이때, 각 배열 항목간에 문자열을 비교하기 위해서는 == 연산자 대신 equals() 를 사용해야 합니다.

== 는 객체의 번지비교이기 때문에 문자열 비교에 사용할 수 없다고 지난 String 포스팅에서 말씀드린 바 있습니다.


배열 복사

배열은 한번 생성하면 크기를 변경할 수 없으므로 만약 공간이 더 필요하다면 보다 큰 배열을 새로 만들고 이전 배열의 값을 복사해야합니다.

크게 두가지 방법으로 보면, 첫번째는 for문을 이용해 일일이 넣어주거나, 두번째로 System.arraycopy() 메소드를 사용하는 것입니다.

for문을 이용한 부분은 C와 크게 다르지 않으므로 생략하고 arraycopy()를 이용하는 부분을 살펴보겠습니다.


예) String[] oldName = {"Java", "Python", "C"};

String newName = new String[5];

System.arraycopy(oldName, 0, newName, 0, oldName.length);

(* oldName.length 는 oldName 배열의 길이입니다.)

이 때, oldName은 길이가 3이고, 새로 만든 newName은 길이가 5입니다.


그리고 arraycopy를 하게 되면 아래와 같이 표현됩니다.



** 향상된 for문 **

일반적으로 for문은 C의 문법과 같이,

ex) for(int i=0; i<10; i++) {

...

}

와 같이 사용할 수 있습니다.

이때, 자바에서는 위의 for문에 더하여

ex) for( 타입변수 : 배열) {

실행문;

}

과 같은 형태로도 사용할 수 있습니다.

배열에서 가져올 항목이 존재할 경우에는 타입변수에 그 값을 넣고 실행문을 실행하고, 이 과정을 for문 안에서 반복합니다.

만약 배열에서 가져올 항목이 없을 경우에는 for문 밖으로 빠져나오게 됩니다.


WRITTEN BY
SiriusJ

,

[String 타입]

: 자바는 문자열을 String변수에 저장하기 때문에 다음과 같이 String 변수를 우선적으로 선언해야 합니다.

ex) String 변수;

이제 변수에 문자열을 저장하려면 큰 따옴표로 감싼 문자열 리터럴을 대입하면 됩니다.

ex) 변수 = "문자열";


==> String 변수 = "문자열";  과 같이 선언과 동시에 저장할 수 있습니다.

( 단, 문자열이 직접 변수에 저장되는 것이 아니라, 문자열은 String 객체로 생성되고 변수는 String 객체를 참조하는 것입니다만 일반적으로 표현할 때에는 String 변수에 저장한다는 표현으로 사용합니다. )


String 관련하여 예시를 하나 들겠습니다.

String name1 = "최진우";

String name2 = "최진우";

String name3 = new String("최진우");


이때, if조건문을 이용하여 비교를 한다고 가정할 때,

name1 == name2  -> true

name1 == name3 -> false

name1.equals(name3) -> true


가 됩니다.

그 이유로는 == 라는 연산자는 변수에 저장된 객체 번지가 동일한지를 검사합니다.

name1과 name2는  동일한 문자열 리터럴로 생성된 객체를 참조하므로 결과가 true가 나옵니다.

그러나 name3은 new 연산자로 String 객체를 별도로 생성했기 때문에 name1 == name3은 false가 나오게 되는 것입니다.


동일한 String 객체이건, 다른 String 객체이건 문자열만을 비교할 때에는 String객체의 equals()메소드를 사용해야 합니다.

equals() 메소드는 원본 문자열과 매개값으로 주어진 비교 문자열이 동일한 지 비교한 후 true또는 false를 리턴합니다.


WRITTEN BY
SiriusJ

,

[데이터 타입(Data Type)]

1) 기본 타입(Primitive Type)

1 - 정수 타입 : byte, char, short, int, long

2 - 실수 타입 : float, double

3 - 논리 타입 : boolean


2) 참조 타입(Reference Type)

1 - 배열 타입

2 - 열거 타입

3 - 클래스

4 - 인터페이스


기본 타입으로 선언된 변수와 참조 타입으로 선언된 변수의 차이점은 저장되는 값이 무엇인가 입니다.

기본 타입을 이용해서 선언된 변수는 실제 값을 변수 안에 저장하지만,

참조 타입을 이용해서 선언된 변수는 메모리의 번지를 값으로 갖습니다.


-> 번지를 통해 객체를 참조한다는 뜻에서 참조 타입이라 부르게 됩니다.


예) int와 double로 age, price라는 변수 선언, String 클래스로 name과 hobby 라는 선언

[기본타입 변수]

int age = 25;

double price = 100.5;

[참조 타입 변수]

String name = "최진우";

String hobby = "피아노";

(** 변수는 스택영역에 생성되고, 객체는 힙 영역에 생성됩니다. **)

즉, name와 hobby는 힙 영역에 생성된 String 객체를 참조하게 됩니다.

'Programming > JAVA' 카테고리의 다른 글

Java - (4) Array Type (배열 타입)  (0) 2016.05.04
Java - (3) String Type (문자열 타입)  (0) 2016.05.04
Java - (1) Java언어의 특징  (0) 2016.05.04
Java(Data Structure) - List, Set, Map  (0) 2016.04.22
리스트(List) TestList  (0) 2016.04.22

WRITTEN BY
SiriusJ

,

Java에 대해 포스팅이 두서없이 이루어진 것 같아서 앞으로 차근차근 중요한 부분 위주로 다시 다뤄보고자 합니다.

먼저 Java언어의 특징부터 다루도록 하겠습니다.


[특징]

1. 이식성이 높은 언어

- 이식성: 서로 다른 실행환경을 가진 시스템 간에 프로그램을 옮겨 실행할 수 있는 것

: Java언어로 개발된 프로그램은 소스 파일을 다시 수정하지 않아도, 자바 실행환경(JRE: Java Runtime Environment)이 설치되어 있는 모든 운영체제에서 실행 가능합니다. 따라서 자바언어는 이식성이 높은 프로그래밍 언어라 할 수 있습니다.


2. 객체 지향 언어

- 객체지향 프로그래밍(OOP) : 프로그램을 개발하는 기법으로 부품에 해당하는 객체들을 먼저 만들고, 이것들을 하나씩 조립 및 연결해서 전체 프로그램을 완성하는 기법

: 자바는 100% 객체지향 언어입니다. 객체를 만들기 위해 설계도인 클래스를 작성해야 하고, 객체와 객체를 연결해 목적에 맞는 프로그램을 만들어 냅니다. 자바는 아무리 작은 프로그램이라도 객체를 만들어 사용하게 됩니다.

처음부터 객체를 고려해 설계되었기 때문에 객체지향 언어가 가져야 할 캡슐화, 상속, 다형성 기능을 완벽하게 지원합니다.


3. 함수적 스타일 코딩을 지원

: 자바는 함수적 프로그래밍을 위해 람다식을 자바8 부터 지원합니다. 람다식을 사용하면 컬렉션의 요소를 필터링, 매핑, 집게처리하는데 쉬워지고, 코드가 매우 간결해집니다.


4. 메모리를 자동으로 관리

: C++은 메모리에 생성된 객체를 제거하기 위해 개발자가 직접 코드를 작성해야합니다. 만약 이 작업을 잘 처리하지 않으면 프로그램은 불완전해지고 갑자기 다운되는 현상을 겪게 됩니다. 자바는 개발자가 직접 메모리에 접근할 수 없도록 설계되었으며 메모리는 자바가 직접 관리하게 됩니다. 객체 생성 시 자동적으로 메모리영역을 찾아서 할당하고, 사용이 완료되면 쓰레기 수집기(Garbage Collector) 를 실행시켜 자동적으로 사용하지 않는 객체를 제거시켜줍니다. 따라서 개발자는 메모리 관리의 수고를 덜고, 핵심기능 코드 작성에 집중할 수 있습니다.


5. 다양한 애플리케이션 개발

: 자바는 윈도우, 리눅스, 유닉스 등 다양한 운영체제에서 실행되는 프로그램을 개발 할 수 있습니다. 단순한 콘솔 프로그램부터 클라이언트용 윈도우 애플리케이션, 서버용 웹 애플리케이션 그리고 모바일용 안드로이드 앱에 이르기까지 거의 모든 곳에서 실행되는 프로그램을 개발 할 수 있습니다.


6. 멀티쓰레드를 쉽게 구현 가능

: 하나의 프로그램이 동시에 여러 작업을 처리해야 하는 경우와, 대용량 작업을 빨리 처리하기 위해 서브 작업으로 분리해서 병렬처리하려면 멀티쓰레드 프로그래밍이 필요합니다.

자바는 쓰레드 생성 및 제어와 관련된 라이브러리 API를 제공하고있기 때문에 실행되는 운영체제에 관계없이 멀티 쓰레드를 쉽게 구현 가능합니다.


7. 동적로딩(Dynamic Loading)을 지원

: 자바 애플리케이션은 여러개의 객체가 서로 연결되어 실행되는데, 이 객체들은 클래스로부터 생성됩니다.

애플리케이션이 실행될 때 모든 객체가 생성되지 않고, 객체가 필요한 시점에 클래스를 동적로딩해서 객체를 생성합니다. 또한 개발완료후 유지보수가 발생하더라도 해당 클래스만 수정하면 되므로 전체 애플리케이션을 다시 컴파일 할 필요가 없습니다. 즉, 유지보수를 쉽고 빠르게 진행할 수 있습니다.


8. 오픈 소스 라이브러리가 풍부

: 자바는 오픈소스언어이므로 자바 프로그램에서 사용하는 라이브러리 또한 오픈소스가 많습니다. 고급 기능을 구현하는 코드를 직접 작성할 경우 시간과 노력이 필요하고, 실행 안전성을 보장할 수 없지만 검증된 오픈소스 라이브러리를 이용하면 개발기간을 단축하며 안전성이 높은 애플리케이션을 쉽게 개발할 수 있습니다.

'Programming > JAVA' 카테고리의 다른 글

Java - (3) String Type (문자열 타입)  (0) 2016.05.04
Java - (2) 데이터타입(Data Type)  (0) 2016.05.04
Java(Data Structure) - List, Set, Map  (0) 2016.04.22
리스트(List) TestList  (0) 2016.04.22
배열(Array) Test_Array  (0) 2016.04.22

WRITTEN BY
SiriusJ

,

이번에는 Java의 자료구조들에 대해서 전체적으로 한번에 다뤄볼까 합니다.


자료구조 : 데이터를 효율적으로 사용할 수있도록 구조를 만들어서 저장해둔 것


(List, Map, Interface)

List

 : 중복이 있고, 순서가 있습니다.


- Vector -> 동기화 : 속도가 느려질 수 있음

- ArrayList -> 비동기화

간단 예시)

*추가) ArrayList 정렬

Collection.sort(this);  -> 올림차순

Collection.sort(this, Collection.reverseOrder()); -> 내림차순


Set

: 중복이 없고 순서도 없습니다.

- HashSet

- TreeSet(정렬)

간단 예시) - TreeSet


TreeSet에서 입력받을 때, 버퍼를 이용해서 입력을 받았습니다.

3번 입력을 받게 하였고, Iterator을 이용하여 출력하게 되었습니다.

TreeSet에서 주요하게 볼 부분은 임의의 값을 넣어주면, 정렬은 기본 오름차순으로 이루어진다는 부분입니다.


Map

: 검색할 때는 가장 빠르고, (Key, Value) 값으로 이루어 진 형태를 가집니다.


- HashTable -> 동기화

- HashMap -> 비동기화

위 TreeSet에서 보았듯이, TreeMap 또한 정렬을 제공합니다.


Map은 기본적으로 객체가 저장되며,

여러가지 타입이 저장 될 수 있습니다.

데이터를 꺼낼 때에는 Object형이기 때문에 적절하게 캐스팅 해줄 수 있습니다.

간단 예시)

- 해쉬맵을 사용하여 map을 생성해 준 후,

map.put() 을 이용하여 각각을 (Key, Value)의 형태로 설정해 줍니다.

이 때, <String, Integer> 형태이므로 Key는 String형태로, Value는 Integer형태로 저장 해주어야 합니다.

다음으로 Set을 이용하여 해쉬맵의 Key 테이블을 가져오게 됩니다. 또한 Key값이 String 형태이므로 Set<String>으로 가져와야 합니다.

그 후, set에 저장된 해쉬맵의 값을 String형태의 str로 값을 추출한 후,

map.get()함수를 이용하여 해당 키에 대한 Value의 값을 출력하게 됩니다.

이 때, HashMap은 정렬을 해주지 않는다는 것이 TreeMap과의 다른점입니다.

TreeMap은 HashMap과 비슷하지만 Key값을 기준으로 정렬됩니다.

HashMap과 사용 방법은 같으므로, 따로 정리하지는 않도록 하겠습니다.


*추가) <String, Integer> 또는 <String> 과 같은 형태를

Generics 라고 합니다. Generics는 간단히 정리하면 미리 들어갈 객체 타입을 넣어주는 것입니다.




마지막으로, 여러 자료구조를 복합하여 사용한 예제를 올려보도록 하겠습니다.

public class Test_HashMap {

public static void main(String[] args) throws IOException{

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

String tmp = br.readLine();

int loop = Integer.parseInt(tmp);

// HashMap에 Data 넣기 (Key , Value) 형태

HashMap<String, Integer> testmap = new HashMap<String, Integer>();

for(int i=0; i<loop; i++) {

String test_s = br.readLine();

String[] test_info = test_s.split(" ");

testmap.put(test_info[0], Integer.parseInt(test_info[1]));

}

// HashMap에 포함된 Key , Value를 Set에 담고 iterator에 값을 Set 정보를 담아 준다.

Set<Entry<String, Integer>> test_set = testmap.entrySet();

Iterator<Entry<String, Integer>> test_iter = test_set.iterator();


        //HashMap에 포함된 Key 중에 "최진우"라는 키를 가질 경우 true 리턴 (없을 경우 false)

if(testmap.containsKey("최진우")) {

System.out.println("최진우 발견!");

System.out.println(testmap.get("최진우"));

}     


        // HashMap에 포함된 key, value 값을 전부 호출 한다.

while(test_iter.hasNext()) {

Map.Entry<String, Integer> test_m = (Map.Entry<String, Integer>)test_iter.next();

System.out.println("이름:"+test_m.getKey() + ", 성적:" + test_m.getValue());

}

//Map에서 저장된 Key들을 가져올 Set을 만든다.

Set<String> test_set2 = testmap.keySet();

System.out.println("사람들"+ test_set2);

// Map에 저장된 value값들 Collection<Interger> 형태로 얻어 오고 iterator에 담는다.

Collection<String> test_name = testmap.keySet();

Collection<Integer> test_grade = testmap.values();

Iterator<String> test_itername = test_name.iterator();

Iterator<Integer> test_itergrade = test_grade.iterator();

while(test_itername.hasNext()) {

String sname = (String)test_itername.next();

Integer sgrade = (Integer)test_itergrade.next();

System.out.println("Name:"+sname);

System.out.println("Grade:"+sgrade);

}

}

}


결과 :

결과창에서, 위의 색있는 부분의 5줄이 입력을 받은 부분이며, 아래로는 출력된 부분입니다.

소스에 주석을 첨부하였으니, 설명은 생략하도록 하겠습니다.

'Programming > JAVA' 카테고리의 다른 글

Java - (2) 데이터타입(Data Type)  (0) 2016.05.04
Java - (1) Java언어의 특징  (0) 2016.05.04
리스트(List) TestList  (0) 2016.04.22
배열(Array) Test_Array  (0) 2016.04.22
function_test  (2) 2016.04.20

WRITTEN BY
SiriusJ

,

이번에는 리스트에 대하여 공부해도록 하겠습니다.

제가 간단히 작성해 본 리스트 소스입니다.

s1은 Integer형태의 리스트로, s2는 String형태의 리스트로 각각 new를 이용하여 리스트 객체를 생성해줍니다.

그 후, add() 함수를 이용하여 각각의 리스트에 값들을 저장해 주게 됩니다.

add()함수는 값을 저장해주고, size()함수는 배열의 크기를 출력해주는 함수입니다.

또한 contains(값)라는 함수도 자바에서 제공해주고 있는데, 이는 값이 해당 배열에 존재하는지를 파악하여 boolean값인 true 또는 false로써 return 됩니다.

이를 이용하여 if문 안에서 case를 구분지어줄 때에도 간단히 사용될 수 있겠습니다.

그 후, for()문에서 기존의 for(int i=0; i<s1.size(); i++) 의 형태와는 다소 다른 것을 확인해 볼 수 있습니다.

해당 for()문의 표현은 s1라는 리스트에서 Integer형태의 su로 하나하나 값을 빼내어 System.out으로 출력해주는 모습이고,

아래의 for문에서는 s2라는 리스트에서 String형의 city로 값을 추출해주어 출력해주는 부분입니다.


그 후, s2에서 remove함수를 사용하여 Busan을 리스트에서 제거해 준 후 

이후 결과값을 살펴보면 아래와 같이 나오는 것을 확인할 수 있습니다.


'Programming > JAVA' 카테고리의 다른 글

Java - (1) Java언어의 특징  (0) 2016.05.04
Java(Data Structure) - List, Set, Map  (0) 2016.04.22
배열(Array) Test_Array  (0) 2016.04.22
function_test  (2) 2016.04.20
Java 기초 코딩.  (0) 2016.04.20

WRITTEN BY
SiriusJ

,

배열을 이용하는 부분에 대하여 작성해보고자 합니다.

자바에서 배열은 객체이며, 사용하기위해서는 생성을 해주어야 합니다.

기본적으로 int형 배열과 string형 배열을 참고하면,

int[] arr1 = new int[10];

String[] arr2 = "test_string";

과 같이 여러 방법으로 생성 해 줄 수 있습니다.

위의 방법은 new를 이용하여 객체를 생성해주는 부분이며 

아래의 스트링 배열은 arr2라는 String배열을 만들어서 바로 스트링 값을 넣어준 부분입니다.

C와 달리 JAVA에서는 배열에 대해 편리한 함수들을 라이브러리로 제공해주고 있습니다.

TestArrays라는 클래스를 만들어 준 뒤,

main함수에서 su라는 int형 배열을 만들어서 값을 직접 입력해주고, ns라는 배열은 크기만 지정해주어 생성해줍니다.


그 후, su에 저장 된 값들을 ns에 옮겨주기 위해 자바에서는 Arrays.copyOf(배열, 배열의 크기) 함수를 제공해줍니다.

이를 이용하여 ns에 배열을 복사하게 됩니다.


그 후, 배열에 대한 정렬을 위해 Arrays.sort()함수를 이용하여 간단히 내림차순으로 정렬이 됩니다.

그 후, ns배열의 각 원소를 출력으로 찍어내면, 아래와 같은 그림으로 나오게 됩니다.

위쪽 5개의 값이 내림차순으로 정렬된 값이며,

아래쪽 5개의 값이 오름차순으로 재 정렬해본 값입니다.

Java에서 유용하게 쓰이는 함수들을 모아서 추후 정리해보도록 하겠습니다.

'Programming > JAVA' 카테고리의 다른 글

Java - (1) Java언어의 특징  (0) 2016.05.04
Java(Data Structure) - List, Set, Map  (0) 2016.04.22
리스트(List) TestList  (0) 2016.04.22
function_test  (2) 2016.04.20
Java 기초 코딩.  (0) 2016.04.20

WRITTEN BY
SiriusJ

,