8~9. 사용자 정의 함수(최대공약수/ k번째 약수/ 마지막문자 뽑기/ 최대값) [프로젝트명 : Tutorial8, 9]
(Tutorial8)
사용자 정의 함수는 정해진 특정한 기능을 수행하는 모듈(작은 기능을 수행하는 장치)을 의미한다. 함수를 활용하여 하나의 문제를 잘게 분해할 수 있다.
메인함수에서 모든 알고리즘을 처리하면 매우 비효율적이다. 사용자 정의 함수를 통해 각각의 모듈로서 쉽게 수정되고 보완되는 장점이 있다.
1. 사용자 정의 함수를 만들어보자. ( Main 클래스 안 <-> Main함수 밖)
(1) public static 이후에 함수는 [반환형]을 먼저 써주어야한다. 그 다음 [함수명], [매개변수] 순이다.
- 매개변수는 함수가 처리할 값을 사전적으로 주어주는 것이다.
// 반환형, 함수명, 매개변수
public static int function(int a, int b, int c) {
return 0;
}
2. 3개의 수 최대 공약수를 찾는 프로그램을 만들어보자.
[ 3개의 수 중 가장 작은 수 찾기 -> 찾은 가장 작은 수를 1씩 줄여가면서(줄여나가다가 나타나면 종료되니 최대가 됨)
-> 3개 모두 나눈 나머지가 0인 공약수 찾고 바로 반환하여 함수 종료시키기]
(1) 최대공약수를 찾을 때는 먼저 3개의 값 중 가장 작은 수를 먼저 찾아내야한다.
- if a와 b를 먼저 비교한 뒤 -> b가 더 작은 경우, if b와c를 비교해서 둘 중 더 작은 값을 min에 넣어준다.
-> a가 더 작은 경우, if a와 c를 비교해서 더 작은 값을 min에 넣어준다.
int min;
if(a>b) {
if(b >c ) {
min =c;
} else {
min = b;
}
}else {
if(a>c) {
min = c;
}else {
min = a;
}
}
(2) 가장 작은 수를 for문을 통해, 1이 될 때까지 줄여주면서 그 안에 포함된 모든 수(약수 포함)를 돌면서,
if문을 통해 [ 3개의 수를 나눈 나머지가 모두 0이 되는, 공통약수]들을 찾아준다.
만약 i가 반환되면 바로 [return i;를 통해 값을 반환하면서, 함수를 바로 종료] 시킨다. 그러면 더 최대공약수가 나오자마자 바로 함수가 종료되므로, 2번째 큰 공약수는 무시된다.
for(int i = min; i>0; i--) {
if( a%i==0 && b%i==0 && c%i==0) {
return i;
}
}
(3) 만약 최대공약수가 없는 경우에 -1값을 반환하도록 return -1;을 함수 맨 마지막에 준다.
return -1;
(4) 메인함수에서 사용자정의함수 function()을 사용하여, 문자를 출력해주자.
public static void main(String[] args) {
System.out.println("(400, 300, 750);의 최대공약수 : " + function(400, 300, 750) );
}
(5) 출력값
(400, 300, 750);의 최대공약수 : 50
(Tutorial9)
3. 약수중 K번째로 작은 수를 찾는 프로그램을 작성해보자.
[ 1부터 숫자까지 증가시키면서, 숫자로 나누어 떨어지는 약수가 k번 발견될 때, 반환한다. 이 때 몇번인지는 k--;로 센다]
(1) 매개변수는 2개를 받자, 약수를 찾을 수인 number와 k번째를 의미하는 k이다.
(2) 1부터 약수를 찾을 숫자 number까지 1씩 증가시키면서, 약수를 의미하는 [number % i ==0] 을 찾을 때마다, k를 1씩 뺀다.
그러다가 k가 0이 되는 순간에 그 약수 i를 return시킨다.
ex> 만약 10번째 약수를 찾기위해, k에 10을 집어 넣었다면, 처음 찾았을 때는 9, 2번째찾으면 8, ... , 10번째 찾으면 0이 된다.
이 때, 약수를 찾은 횟수가 k만큼 돌아서 0이 되는 순간에 return시켜서 해당 약수를 반환시키는 것이다.
(3) for문을 통해 1부터 숫자까지 돌았는데, k번째 약수가 안나타난다면, for문을 빠져나와서 -1을 return하도록 한다.
public static int function(int number, int k) {
for(int i =1; i<=number; i++) {
if(number % i ==0 ) {
k--;
if(k==0) {
return i;
}
}
}
return -1;
}
(4) 메인매쏘드에서 함수를 사용해보자. 3050의 10번째 약수를 받아와 result에 넣어주고, 출력하자.
public static void main(String[] args) {
int result = function(3050, 10);
if(result == -1) {
System.out.println("3050의 10번째 약수는 없습니다.");
}else {
System.out.println("3050의 10번째 약수는 "+result+"입니다");
}
}
(5) 출력값
3050의 10번째 약수는 610입니다
4. 문자열의 마지막 단어를 반환하는 함수를 작성해보자.
(1) 문자열 하나를 입력 받아, 문자열의 단어 하나를 반환하는 public static char function(String input) {} 매쏘드를 만들자.
(2) input.charAt()을 이용해서, 문자열 중 하나의 단어만 가져올 수 있다. 이때, 파라미터에 문자열변수.length() -1 을 넣으면 가장 마지막 단어의 index를 의미하게 된다.
(charAt()의 index는 0부터 세고, length는 1부터 세니까.. length-1하면 마지막 index값을 가져올 수 있다)
public static char function(String input) {
return input.charAt(input.length()-1);
}
(3) 매인매쏘드에서 사용해본다.
public static void main(String[] args) {
System.out.println("Hellow World의 마지막 단어는 "+function("Hello World") +" 입니다.");
}
(4) 출력값
Hellow World의 마지막 단어는 d 입니다.
5. max()를 활용해서 최대값을 저장하는 함수를 작성해보자.
[ 2개 중 최대값은 삼항연사자로 만든 함수를 만들고, 3개 중 최대값은 2개 최대값 함수를 이용해서,
최대값을 뽑아 낸 것을 담아 놓고, 그것을 다시 2개 최대값 함수로 비교하자]
(1) 2개의 정수를 받아 삼항 연산자를 이용해서 큰놈을 return하자.
public static int max(int a, int b) {
return (a>b)? a:b;
}
(2) 3개의 정수를 받아, (1)에서 만든 매쏘드를 활용해서 최대값을 뽑아내자.
public static int function(int a, int b, int c) {
int result = max(a,b);
result = max(result, c);
return result;
}
(3) 메인매쏘드에서 출력해보자.
public static void main(String[] args) {
System.out.println("(345, 567, 789)중 가장 큰 값 : "+function(345,567,789));
}
'Java > 기초 튜토리얼' 카테고리의 다른 글
12. 배열(Array) (입력받은 배열의 최대값/ 100개의 랜덤 정수의 평균) [ Tutorial12 ] (0) | 2018.02.19 |
---|---|
10~11. 반복함수와 재귀함수(팩토리얼 / 피보나치 수열) ) [프로젝트명 : Tutorial10, 11] (0) | 2018.02.19 |
7. 기본 입출력 / 파일 입출력 (Scanner/file 입출력) [프로젝트명 : Tutorial7] (0) | 2018.02.18 |
5~6. 조건문 & 반복문(contains/점수조건/equals/합/삼각형/원 만들기) [프로젝트명 : Tutorial5, 6] (0) | 2018.02.08 |
4. 연산자(operator) (증감/삼항연산/거듭제곱pow()) [프로젝트명 : Tutorial4] (0) | 2018.01.28 |
7. 기본 입출력 / 파일 입출력 (Scanner/file 입출력) [프로젝트명 : Tutorial7]
java언어의 기본적인 입출력방식을 알아보자.
자바에서는 대표적으로 Scanner클래스를 이용해서 사용자와 상호작용할 수 있다.
일반적으로 Scanner sc = new Scanner(System.in);으로 클래스 객체를 생성한 뒤에,
sc.nextInt();와 같은 방법으로 int형을 입력받을 수 있다.
입력받은 자료는 내부적으로 처리한 뒤에 다시 사용자에게 그 값을 반환한다.
프로그램이 입출력을 잘 지원한다는 것은 사용자 인터페이스가 뛰어나다는 의미와 같다. 나중에 Gui를 배우게 되면 이러한 입출력을 훨씬 용이하게 할 수 있다.
1. 특정한 정수를 입력 받아서 그대로 출력하는 프로그램을 작성해보자.
(1)Scanner라는 클래스의 인스턴스 변수(객체형 변수, 대문자로 시작, 클래스의 객체)인 sc를 만들고, 우항에는 객체를 생성해 초기화를 해주자.
이때, 오류가 나는 것을 클릭해서 java.util라는 자바 기본 라이브러리 것을 import하자.
-파라미터의 System.in은 console창에 입력하는 데이터들을 의미한다.
(2) int i = sc.nextInt(); 는 사용자가 입력한 정수를 i에 넣는 다는 의미이다.
(3) sc.close();를 통해 입출력하는 변수sc를 닫아 주어, 안정적으로 종료시킨다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); //콘솔창에서 입력받는데 필요한 스캐너변수
System.out.print("정수를 입력하세요 : ");
int i = sc.nextInt();
System.out.println("입력된 정수는 "+i+"입니다");
sc.close();
}
}
2. 파일에 입력된 정수에 100을 곱해서 출력하는 프로그램을 작성해보자.
[ 파일을 컨트롤 하는 file변수 -> file의 내용을 읽어올 수 있는 scanner 변수]이용
(1) File클래스를 이용해 file이라는 변수를 만들고, 객체를 생성해 초기화를 할 때, 매개변수에는 "input.txt"라는 파일명을 넣어준다.
이때, 파일은 프로젝트 창에서 새로 생성할 것이다.
File file = new File("input.txt");
(2) Scanner클래스를 사용하는데, 매개변수에는 콘솔창에 입력되는 데이터(System.in)가 아닌 file변수를 넣어준다.
(3) 매개변수에 빨간줄이 난 것은 아직 input.txt라는 파일이 없어서 file변수가 비어있거나 등등의 예외처리가 안되어서 나는 것이다.
빨간줄에 마우스를 갖다대어, try/catch문을 입혀주자. (예외처리문) catch문에서는 println으로 파일 읽는데 오류가 발생했다고 띄워주자.
(4) try문 내부에 계속 코드를 이어가는데, while문의 조건으로 sc.hasNextInt()(반환되는 것이 boolean형)를 통해
sc가 읽어오는 file(input.txt)에서 '다음에 읽어올 정수가 존재하는지?'를 조건으로 건다.
그리고 조건문 안에는 실제로 '다음에 읽어오는 정수 값'인 sc.nextInt()에 100을 곱해서 출력해주자.
(5) while문을 나와서 다음에 읽어올 정수가 없는 것으로서, 입출력이 끝났으니 스캐너함수를 닫아주는 sc.close()로 닫아주자.
File file = new File("input.txt");
try {
Scanner sc = new Scanner(file);
while(sc.hasNextInt()) {
System.out.println( sc.nextInt() * 100 );
}
sc.close();
} catch (FileNotFoundException e) {
System.out.println("파일을 읽어오는 도중에 오류가 발생했습니다");
}
(6) 이제 file 매개변수인 input.txt파일을 만들어주자. Tutorial7 우클릭 > new > File > file name : [ input.txt ]
(7) txt파일 안에 정수를 임의로 입력하자. space로 간격 or 줄바꿈을 주면 숫자들이 구분된다
170 580 30
2000
30
2080
(8) 출력된 값은 아래와 같다.
17000
58000
3000
200000
3000
208000
'Java > 기초 튜토리얼' 카테고리의 다른 글
10~11. 반복함수와 재귀함수(팩토리얼 / 피보나치 수열) ) [프로젝트명 : Tutorial10, 11] (0) | 2018.02.19 |
---|---|
8~9. 사용자 정의 함수(최대공약수/ k번째 약수/ 마지막문자 뽑기/ 최대값) [프로젝트명 : Tutorial8, 9] (0) | 2018.02.18 |
5~6. 조건문 & 반복문(contains/점수조건/equals/합/삼각형/원 만들기) [프로젝트명 : Tutorial5, 6] (0) | 2018.02.08 |
4. 연산자(operator) (증감/삼항연산/거듭제곱pow()) [프로젝트명 : Tutorial4] (0) | 2018.01.28 |
3. 변수관련 상식(반올림) 과 자료형 [프로젝트명 : Tutorial3] (0) | 2018.01.28 |
3~4 그룹관리 & 이동/선택시 단축키 & 마법봉
3. 그룹관리 : 2강의 예제파일( 일러강의02-선택툴-outline-CC)을 열어보면 파란색 스마일 오브젝트가 있다.
(1) 드래그해서 선택해보면 좌측 상단에 [Path]라는 문구가 보인다. 즉 이것들이 그룹화 안되어 있다는 것이다.
[Ctrl + G]로 그룹화 한다.(우클릭 Group)으로 해도 된다. 이제 왼쪽상단에는 Group으로 표시된다.
[Ctrl + shift + G]로 언그룹화 한다.
(2) 이제 그룹화 된 내용물을 단독으로 움직일려면 하얀색화살표(a)를 선택한 다음, 빈곳을 클릭해 전체선택이 안된 상태에서, 각 오브젝트를 이동시켜본다.
그 다음, (v)로 움직이면 다시 그룹된 체 움직인다.
(3) 검은화살표 상태에서 [ 그룹화 된 것을 더블클릭 ]하면 [우클릭>isolated selected group ]과 같은 상태로, <그룹 안으로 들어오게 된다> 레이어를 보면 알 수 있다.
이 상태는 하얀화살표처럼 각 오브젝트를 마음대로 움직일 수 있다. 그리고 [빈곳을 더블클릭]해서 그룹 밖으로 나올 수 있다.
*잠깐 그룹을 풀어서 쓸꺼면 이 방법을 쓰자.
4. 이동시 단축키 / 선택시 단축키
1. 이동시 단축키
- 오브젝트를 누른 상태에서 [Shift ] : 각을 맞춰서 이동한다
- 오브젝트를 누른 상태에서 [Alt ] : 마우스를 놓는 지점에서 <복사> - (ppt에서는 Ctrl이 복사)
- [Ctrl + D] : 이전행동 반복실행으로, <드래그 + shift + alt>로 각맞춰서 + 이동후 복사 한 뒤에, 오브젝트 배열을 이루어 복사 반복으로 많이 쓰인다.
2. 선택시 단축키 : 일러스트는 드래그로 선택시 일부분만 포함되도 -> 통째로 포함이 되어버린다.
(1) 한 오브젝트를 선택한 상태에서 + [shift]를 누르고 클릭하면, 빨간박스는 포함되는 것을 싸고 있지만, 실제 선택되는 부분은 클릭한 부분만 선택된다.
우측 컬러패널에서 색을 바꿔보자. ( 다시 shift를 누른상태에서 클릭하면 선택이 풀린다)
(2) 하얀색 화살표를 누른상태에서 [alt]를 누르면 하얀색+인, Group Selection Tool로 바뀐다.(+가 생기며, 어떤 기능하는지 모르겠다)
cf)
하얀화살표+[그룹선택도구]는 그룹안에 그룹 + 그룹으로 묶여있는 경우에 사용하기 유용해요. 여러 그룹으로 묶여있는 오브젝트를 그 안에서 또 다른 그룹만 선택할 수 있게 되죠. 그에 비에
하얀화살표[직접선택도구]는 그룹의 그룹의 그룹으로 묶여있어서 선택하는거 한개만 바로 찔러 들어가게 되는 툴이에요. 그치만 그것까지 세세하게 정리하면서 일하는 사람들이 의외로 적은거 같아요.
(3) [Ctrl]을 누르고 있는 동안 직전에 사용한 도구로 바뀐다. ex> 검은화살표-> 하얀화살표-> Ctrl 누르는 도중은 검은화살표로 바뀌어서 행동함
3. 마법봉 : 선택한 놈과 비슷한 색들을 모두 선택해주는 가져오는 도구.
- 구체적인 것은 Select > same> 에서 선택할 수 있다.
3. 인터페이스 & 패키지 와 API의 개념
[프로젝트 : javase04 ]
[1] 인터페이스(interface) - 수단
예를 들어, 프린터 포트, vgb포트, usb포트 등 모두 단자, 인터페이스로서 바깥 세상과 통신하기 위한 수단이다.
data encapsulation이란 어떤 객체가 지정된 매쏘드에 의해서 바깥과 통신하는 수단을 구축하는 것이다. 이것을 통해 여러 이익들이 얻어질 수 있다.
이 데이타 인캡슐래이션을 구현화 하는 개념 중 하나가 인터페이스다.
쉽게 설명하면, [노래방 리모콘의 버튼]이라고 생각하면 된다. 숫자를 누르고 시작버튼을 누르면 -> 어떤 객체가 수행할 수 있다는 것을 외부에 알려주면서 통신도 일어나게 한다.
일반적으로 메세지를 주고 받는데, 객체<->객체간에 주고 받는데, 그 메세지를 주고받기 위한 수단(통로)이 interface이다.
*인터페이스는 매쏘드의 내용이 없고, 선언만 있다.
왜냐면 인터페이스는 외부와 통신하기 위한 수단이므로, 노래방리모콘의 시작버튼일 뿐, 겉에서 볼 땐 노래를 시작하게 하는 것은 아니다.
1.
public interface Touchable {
void touch();
}
- [public]은 '접근제한자' 라고 한다.
- [interface]는 인터페이스를 의미한다. 필드와 매쏘드를 가진 클래스라면 class가 들어갈 것이다.
- 클래스와 형식은 보이지만, void라는 [리턴타입]과 Touch()라는 [매쏘드]만 있고 { }중괄호로의 내용은 없이 바로 끝이난다. 이런형태가 인터페이스이다.
즉, 매쏘드의 선언만 있을 뿐이다.
2. 다형성(Polymorhism)
public class SmartPhone implements Touchable {
public void touch(){
System.out.println("터치를 하다.");
}
}
- 클래스 SmartPhone은 인터페이스 Touchable을 상속하였다(implements). 상속이라는 것은 부모클래스가 자식클래스에게, 자기가 가진 필드와 매쏘드를 물려주는 것인데, 인터페이스도 상속이 된다.
- 클래스의 상속은 [extends]를 쓰지만, 인터페이스의 상속은 [implements]라는 예약어 쓴다.
* 클래스의 상속은 구현화안해도 되지만, 인터페이스의 상속은, 인터페이스에는 실제적인 내용이 없기 때문에, 상속받는 SmartPhone이라는 클래스에서 반드시 구현을 해줘야한다.
위 코드에서 Touch()매쏘드가 { }중괄호가 열리면서 내용을 작성하였다.
* 인터페이스는 상속(implements)시 여러개의 상속이 가능하다.
[2] 패키지와 API(package & API)
패키지(package) : interface나 class(객체를 찍어내는 틀, 공통 필드와 매쏘드를 쓰게함)들을, 목적이 비슷한 종류끼리 모아놓은 폴더 같은 것
API(Application Programming Interface) : 프로그램을 만드는데 필요한, 미리 제공되는 패키지(interface+class 모음 폴더)들의 집합 by JDK
*나는
패키지=class + interface의 모음/
API = class+interface의 모음인 패키지들이 제공되는 것 = 라이브러리
이라 기억할 것임.
가장 먼저 볼 패키지는 Java.lang이라고 하는 패키지이다. 실습시간에 살펴본다.
구글에서 Java SE 8 API 검색 하면된다. 라이브러리라고도 한다.
총정리)
자바는 OOP의 개념으로 이루어진 객체지향언어이다. 객체끼리 메세지를 주거받거나 객체를 매쏘드로 이용하는 것
객체는 모든 것이다.
클래스는 객체를 만들어내는 틀이다.
상속(inheritance)는, 클래스만으로 부족하여, 부모클래스가 자식클래스에게 Field와 Method를 물려주는 것이다.
인터페이스(interface)는 다른 객체와 통신하기 위한 수단이다.(내용물은 x , 쓰는놈이 구현화해야함)
패키지(package)는 class와 interface들인데, 비슷한 목적을 가진 것들을 분류해놓은 폴더이다. ex> java.lang
[3] 실습 [javase04]
(1) 새로운 프로젝트(javase04)를 만들고, src > 우클릭 > java > interface > Package(클래스+인터페이스 모음) : test / Name : Touchable 이라 만든다.
(2) 내부에 void touch(); 매쏘드를 만들자. 인터페이스는 { } 중괄호를 이용해서 매쏘드의 [body]를 만들어주면 오류가 뜬다. 내용물은 비어있어야한다.
package test; //패키지 선언이다. 인터페이스 Touchable은 test라는 패키지안에 들어있게 된다.
public interface Touchable {
void touch();
}
(3) 이제 Touchable을 상속받는 클래스 SmartPhone을 만들어본다.
*test패키지 우클릭 >new>class>
Package : test확인 후 / Name에 SmartPhone / Interfaces > Add... > Touchable을 검색해서 상속할 인터페이스를 추가 / main매쏘드 추가(실행할 클래스니까)
package test;
public class SmartPhone implements Touchable {
@Override
public void touch() {
// TODO Auto-generated method stub
}
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
(4) 생성해보면 위와같이, touch()라는 매쏘드가 자동으로 오버라이딩 되어있다. ( touch()에 에러가 나면, 이클립스를 다시시작하면 없어진다.)
(5) touch()매쏘드 내부에는 출력문을 하나 적어준다.
(6) 메인매쏘드에서는 SmartPhone의 객체를 하나 만들어보고, 클래스의 touch()매쏘드를 호출해서, 실행시켜보자.
public static void main(String[] args) {
// TODO Auto-generated method stub
SmartPhone s = new SmartPhone();
s.touch();
}
(인터페이스의 빈 매쏘드-> 구현화로서, 내용을 적어주고 -> 객체를 생성해서 사용) :
굳이.. 빈 매쏘드를 채워서 사용하는지 아직까지는 필요성을 못느끼겠다.
[4] API문서(비슷한목적의 class/interface를 모아놓은 패키지를 제공해주는 것 = 라이브러리) 보기
1. 구글에 'java se 8 api'라고 검색한 뒤, 오라클 홈페이지의 문서를 보자(프로그램 제거에서 나의 자바버전 확인했다)
- https://docs.oracle.com/javase/8/docs/api/
2. api문서에서 첫번째 화면에 Packages가 나와있다. java.***.*** 이 설명과 함께 제공된다.
3. java.lang을 찾아가보자. 자바프로그래밍 언어의 디자인에 대한 기본적인 클래스들이라고 나와있다. 클릭해보자.
4. Interface Summary 와 Class Summary가 있다. 여기서 눈여겨볼 것은 Class Summary의 Object다.(클래스, 인터페이스는 대문자 시작)
- Object는 모든 클래스 계층구조(hier archy)의 뿌리다. 이말은, 우리가 만든 모든 클래스의 머리에는 Object가 부모로 존재한다.
5. Object를 클릭해보면, 생성자(Constructors)에 대한 설명이 나온다. 그리고 Method에 대한 것들이 나온다.
6. 우측의 hashCode()라는 매쏘드를 써보자.설명에는 객체에 대한 해쉬코드를 리턴해주는 매쏘드라 나와있다.
7. 실습화면에서
(1) SmartPhone객체를 참조한 변수 s.hashCode();를 작성해보자. (즉, 우리가 만든 클래스 SmartPhone이라는 것은, 클래스이므로 object클래스의 자식이고, 그 Object라는 클래스속 매쏘드 .hashCode();를 우리가 만든 클래스의 객체인 s에서도 사용이 가능한 것이다.)
(2) 이걸로 끝이 아니다 hashCode();에 마우스를 갖다 대면 리턴타입으로 int라고 나와있다. 좌항에서 int변수에 결과값을 받는다. 그 값을 출력해보자.
-hashCode();는 객체마다 고유의 int값을 리턴한다.
SmartPhone s = new SmartPhone();
s.touch();
int i = s.hashCode();
System.out.println(i);
8. 중요한 것은, 우리가 만든 클래스일지라도, SmartPhone 이라는 클래스는 Object를 상속받고 있고, 그 Object의 매쏘드인 hashCode();라는 매쏘드를 쓸 수 있다.
'Java > 심화 개념설명' 카테고리의 다른 글
6. 인터페이스(상세), JavaDoc, 상속, 형변환, 오버라이딩, 다형성, super(생성자/오버라이딩) [javase07] (0) | 2018.02.20 |
---|---|
5. 클래스, 생성자, Overloading, this, 접근제한자, 소유제한자, 객체, JVM메모리구조 [ javase06 ] (0) | 2018.02.19 |
4. 변수의 종류와 배열(Array) [프로젝트 : javase05] (0) | 2018.02.18 |
2. 데이터 캡슐화 & 상속 & 이클립스 폰트 바꾸기 (0) | 2018.02.08 |
1. 객체지향프로그래밍(Object Oriented Programming) (0) | 2018.01.28 |
2. 데이터 캡슐화 & 상속 & 이클립스 폰트 바꾸기
[프로젝트 : javase03 ]
[1] 데이터 캡슐화(data encapsulation)
캡슐화란 캡슐처럼 안쪽 내용물이 전혀 보이지 않게 된다. 이때, 안쪽의 내용물은 데이터 혹은 필드(속성)을 의미한다.
그리고 그 속에 필드와 같이 정의된 매쏘드를 통해서 필드는 외부와 통신하게 된다.
*캡슐화에 따른 이익
1. Modularity(모듈화) : 객체 안에다가 쓰인 소스코드가 <독립적>으로 존재할 수 있게 되어, 어디서든 쓰일 수 있는 <유연성>이 생긴다.
2. information-hiding(정보 은닉) : 가장 기본적인 특징이다. 정보은닉의 대표적인 예가 데이터캡슐화라고 할 수 있다. 안쪽의 상세내용을 숨기면서 매쏘드를 통해 외부와 통신한다.
3. Code re-use(코드 재사용) : 잘 만들어진 객체는, 다른 개발자들이 가져와서 재사용할 수 있다. 모듈화를 해놨기 때문에 가져와서 붙혓다가 뗄 수 있는 것이다.
4. Pluggability and debugging ease : 플러거빌리티는 마음대로 뺏따 꼽았다 하며 대체될 수 있다는 뜻이고, 하나의 모듈로서 다른 것과 맞물리지 않기 때문에 디버깅 하기 쉽다. 고장나면 바꿔끼면 된다.
[2] 상속(inheritance)
부모클래스가 자식클래스가 <필드와 메소드>를 물려주는 것. is a(이즈 어) 관계라고 한다.
예를 들어)
[생물] 이라는 클래스는
[동물] 과 [식물] 클래스로 나뉘어진다.(자식클래스로 가진다)
이때, 포함관계를 생각하여 반대로 화살표(uml, 상속을 나타내는 화살표)는 거슬러서 올라간다고 생각하면,
[동물->생물] or [식물-> 생물]의 관계가 된다고 생각할 수 있다.
[동물] is a [생물] , [식물] is a [생물] 이 된다.
[동물]도 [포유류]와 [조류] 로 나눌 수 있고, [포유류]도 [인간]과 [원숭이]로 나눌 수 있다.
이러한 것을 계층구조도 [hierarchy(하이어러키)] 라고 한다.
화살표가 위로 갈수록 <일반화> 내려갈수록 <구체화>가 되는 것이 계층구조도의 특징이다.
이때, 부모클래스는 필드와 매쏘드를 물려준다고 했으니, [생물]이 살아있다()라는 매쏘드를 가지고 있다면, [동물]과 [식물]모두 살아있다()라는 매쏘드를 가지고 있게 된다.
[동물]이 움직인다()매쏘드를 가지고 있으면, [포유류], [인간] 과 [원숭이] 다 같이 움직인다() 가지게 된다.
그러므로 굳이 [인간]은 움직인다()라는 것을 매쏘드를 만들어 놓을 필요가 없게 된다.
=> 반복적으로 들어가야하는 코드를 줄여주는 상속의 가장 큰 특징이 있다. 형변환에 있어서 가장 큰 힘을 발휘하는 것이 상속이다.
자바의 구조는 모든 계층구조도의 위(root)에는 Object(객체)라는 클래스를 가진다.
Object(객체)라는 클래스에 있어서 위로 올라가는 <is a>관계를 생각해보면, [생물]도 Object(객체)고, [동물]도 객체고, [포유류]도 객체고, [인간]도 객체가 되게 된다.
public class Car{
String color; // [ 필드 ] 혹은 [ property ] 혹은 [ member variable(멤버변수) ] 3가지로 불린다.
void run(){ //매쏘드
System.out.println("차가 달립니다");
}
}
public class Avante extends Car{ // Avante클래스는 위에서 만든 Car라는 클래스를 상속하였다.
public static void main(String[] args){
Avante a = new Avante(); // 객체를 만들어서, a라는 변수에 넣어줬다.
a.color = "빨간색"; // Car클래스를 상속한 Avante의 객체는 Car클래스의 필드(color)를 사용할 수 있따.
a.run(); // Car클래스를 상속한 Avante의 객체는, Car클래스의 매쏘드run()을 사용할 수 있다.
}
}
*멤버변수 = 클래스 내 필드 라 생각하는 버릇을 가지자
(1) extends는 상속의 예약어(다른데서 쓸수 없음) 이다.
(2) 구조는 [Car]라는 클래스가 있고, [Car]에는 color와 run()매쏘드가 있다. 그리고 [Avante]는 [Car]를 상속했다.
-> Avante는 Car의 필드와 매쏘드를 모두 쓸 수 있다.
(3) 메인매쏘드라는 것은, 클래스를 실행할 때, 실행되는 매쏘드이다.
(4) [Car]는 [부모클래스] = [super class], [Avante]는 [자식클래스] 혹은 [sub class]
[3] 실습
1. 이클립스 폰트 설정 바꾸기
(1) 구글에서 naver개발의 '나눔고딕코딩' 글자를 다운받는다. 영문과 고정폭을 가지고 있어서 쓰기가 좋다
- https://github.com/naver/nanumfont
(2) 다운받은 파일을 더블클릭해 설치한다.
(3) 이클립스의 window>preferences> General > Appearance > Colors and Fonts > Basic > [ Text Font ]를 선택 - Edit버튼을 눌러,
나눔고딕코딩 글꼴을 선택 & 글자크기도 조절한다.
* 나는 기존에 것이 더 맘에 들어서 default 눌러서 다시 돌아왔음.
* 만약 줄번호가 보이지 않는다면, 회색부분에서 우클릭으로 show line numbers를 선택해준다.
* 우측 상단에 J 모양의 아이콘은 Perspective(펄스펙티브)아이콘으로, 자바클래식에서 다양한 시각으로 왔다갔다 할 수 있다.
이것을 끌어다가 PackaageExplorer의 왼쪽 패널로 이동시키고, show text로 바꿔주자.
2. 실습하기
(1) 새로운 프로젝트 javase03으로 만든다.
(2) src폴더에 우클릭 > new class> Car라는 클래스이름으로 생성하고,
나중에 만들 클래스에서 필드와 매쏘드만 상속하고, 실행은 안시킬 것이기 때문에 메인함수 생성은 체크하지않는다.
안에 필드와 매쏘드를 만들어 준다.
public class Car {
String color; //필드, 멤버변수
void run() { //매쏘드
System.out.println("차가 달려요");
}
}
(3) src폴더 우클릭> new class> Avante클래스를 만드는데, superclass에 기본 <java.lang.Object>로 되어있는 것을 [edit]를 눌러,
<Car>를 쳐서 검색하여 선택한다. 메인매쏘드도 체크를 해준다.
(4) Avante클래스의 메인함수에다가, 객체를 생성하여 변수 a에 넣어준다. a. 만 쳐도, 상속한 Car클래스의 필드와 매쏘드가 자동완성 항목으로 뜨게 된다.
public class Avante extends Car {
public static void main(String[] args) {
// TODO Auto-generated method stub
Avante a = new Avante();
a.color ="빨간색";
a.run();
System.out.println(a.color);
}
}
'Java > 심화 개념설명' 카테고리의 다른 글
6. 인터페이스(상세), JavaDoc, 상속, 형변환, 오버라이딩, 다형성, super(생성자/오버라이딩) [javase07] (0) | 2018.02.20 |
---|---|
5. 클래스, 생성자, Overloading, this, 접근제한자, 소유제한자, 객체, JVM메모리구조 [ javase06 ] (0) | 2018.02.19 |
4. 변수의 종류와 배열(Array) [프로젝트 : javase05] (0) | 2018.02.18 |
3. 인터페이스 & 패키지 와 API의 개념 (0) | 2018.02.08 |
1. 객체지향프로그래밍(Object Oriented Programming) (0) | 2018.01.28 |