블로그를 풀고 정보보안 문제들을 풀고, 문서를 작성하고 하면서 자주 절차등을 표현하기 위해서 화면을 캡처하는 일이 많다. Window에 기본으로 있는 Snippintool은 뭔가 시간 손해를 보는거 같고, Ctrl + Shift + S를 통해서 구동하는 Capture 프록램은 안켜질때가 가끔 있으며, 클립보드로 들어가기에 로컬에 저장하기 위해서는 그림판에서 다시 저장해야하는 수고스러움이 있어서 직접 만들어 보았다.
*무단배포는 금지합니다.(댓글달아주세용) * 기능에 커스터마이징이 필요하시다면 댓글달아주세용 * 설정은 exe가 위치한 폴더에 config.dat로 저장됩니다. 다른 프로그램이 덮어쓰지 않도록 주의부탁드립니다.
* JAVA 15 이상을 요구합니다.
사용법
프로그램의 설정은 위와 같다. 실행하면 다음과 같은 설정을 볼 수 있다. 프로그램은 상시 가동중이며 설정창을 꺼도 상관은 없다. 캡처영역인 Point1 과 Point2는 SELECT버튼으로 선택할 수 있다. 비활성화된 SELECT 버튼에서 화면을 선택하면 설정된다. Point1은 기본적으로 Point2보다 좌측상단이어야한다. 맨 처음 실행 시 Point1과 Point2는 주화면의 해상도로 설정되어있다.
Ctrl + 4 : Point 1 ~ Point 2 영역을 캡처한다.
Ctrl + 5 : 누른상태에서 화면의 다른곳을 두번 클릭하면 그 영역이 캡처된다.
기본적으로 캡처된 화면은 Save Location에 저장되고, 클립보드에도 복사된다. 원하는곳에 Ctrl + V를 통해서 그림을 붙여넣을 수 있다.
지난시간에 내용을 기억하고 계신지요! 지난시간에는 클래스와 객체에 대해서 알아보았습니다. JAVA는 "객체지향 프로그래밍"이라는 프로그래밍 방법론을 주되게 사용하며, 이 "객체"를 만들기 위한 도구를 "클래스(class)", 도구로 생성된 객체의 실제형태를 "인스턴스(Instance)"라고 부른다는것이 지난 글의 주된 내용입니다. 이번시간에 다룰 주제는 객체와 인스턴스를 구현하는 생성자에 대한 이야기를 조금 더 깊게 해볼까 합니다. 지난 이야기가 기억이 나지 않으신다면, 꼭! 저번 글을 읽고 와주시기 바랍니다!
// Dog.javapublicclassDog{
int gender;
int height;
int weight;
boolean adorable;
boolean cute;
Dog(){
System.out.println("Hello Im dog");
} // 객체생성자publicvoideat(){}
publicvoidbark(){}
publicvoidsleep(){}
publicvoidtailling(){}
}
위의 코드 중 Dog(){}라는 부분이 이 Dog 클래스의 생성자입니다. 생성자는 다음과 같은 특징이 있습니다!
생성자는 클래스이름(){}의 형태로 이루어진다.
생성자는 파라미터(소괄호 안에 들어가는 부분) 를 변경하여 여러개 생성할 수 있다.
생성자를 생략하면 디폴트 생성자( 클래스이름(){} ) 이 자동으로 추가된다.
코드를 통해서 살펴보겠습니다!
// Dog.javapublicclassDog{
int gender;
int height;
int weight;
boolean adorable;
boolean cute;
// 3. 아래처럼 클래스이름(){} 된 생성자는 디폴트 생성자(Default Constructor)라고 부르며// 생성자를 명시하지 않은 경우에 자동으로 컴파일러에서 붙여준다.
Dog(){
System.out.println("Hello Im dog");
} // 1. 객체생성자, 생성자는 클래스이름과 동일한 함수의 형태를 가진다.
Dog(int gender){
this.gender = gender;
} // 2. 파라미터를 다르게 하여 여러개의 생성자를 선언할 수 있다.publicvoideat(){}
publicvoidbark(){}
publicvoidsleep(){}
publicvoidtailling(){}
}
2.의 내용처럼 파라미터를 다르게 하여 생성자를 여러개 선언하는 것을 생성자 오버로딩(Constructor Overloading)이라고 부릅니다! 추후 함수에 관련된 이야기를 할 떄도 Overloading이라는 단어를 보실 수 있으실 겁니다!
// Dog.javapublicclassDog{
int gender;
int height;
int weight;
boolean adorable;
boolean cute;
Dog(){
System.out.println("Hello Im dog");
}
Dog(int gender){
this(); // 위의 Dog(){ System.out.println("Hello Im dog"); } 호출this.gender = gender;
}
publicvoideat(){}
publicvoidbark(){}
publicvoidsleep(){}
publicvoidtailling(){}
}
이렇게 생성자를 다른 생성자에서 사용함으로 나오는 이점은 생성자를 재사용할 수 있다는 점입니다. 생성자A와 B가 있는데, 모든 100가지 줄이 같고 B에 한줄만 추가되는 거라면? 궅이 같은 내용을 A / B에 두번씩 쓸필요없이, A에 한번만 쓰고, B는 A를 호출하기만 하면 되겠죠?
이번시간에는 여러가지 생성자를 선언하는 방법과 디폴트 생성자, this키워드가 어떤것인지, 사용은 어떻게 하는지 알아보았습니다. 다음시간에는 객체의 기능, 행동을 표현하는 매서드(함수)에 대해서 알아보겠습니다!
프로그래밍 방법론(Programming Methodology)라는 것이 있습니다. 프로그래머는 컴퓨터와 대화를 하는 사람으로 어떠한 언어를 사용해서 컴퓨터와 대화를 할지 결정해서 컴퓨터에게 작업을 지시하기도 하고, 컴퓨터의 이야기를 듣기도합니다.
JAVA라는 언어로 대화하기를 선택한 우리들은 JAVA언어를 어떻게 전달하는지 그 "방법" 알아야 [효율적]으로 컴퓨터와 대화할 수 있습니다. '어떻게 컴퓨터에게 작업을 지시할 것인지에 대한 방법'을 "프로그래밍 방법론"이라고 부를 수 있습니다.(위키백과의 정의도 아래 남겨두겠습니다.) JAVA는 그 중 '객체지향 프로그래밍(Object Oriented Programming)'이라는 방법론을 사용합니다.
객체지향이란?
객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.
"객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다."
객체지향에서 핵심적인 단어들이 위에 적혀있습니다. 만약 우리가 '강아지'와 '고양이'을 "객체"로 간주한다면 다음과 같이 표현할 수 있습니다.
위 그림에서 '강아지'와 '고양이'는 객체(아래부터는 '클래스'라는 이름과 혼용하겠습니다.)입니다. 객체(클래스)는 성별, 키, 몸무게 같은 속성을 가질 수 있고, 밥먹기, 잠자기 등의 '행동'을 할 수 있습니다. 타 프로그래밍언어의 '함수'가 JAVA에서는 '메서드'라고 불린다고 생각해 주시면됩니다.
프로그래밍에서 함수란 0개 이상의 입/출력을 받아 무엇인가 기능을 하는 개념입니다. JAVA에서는 이 함수를 '메서드'라고 부르며 '메서드'를 통해서 객체와 객체가 상호작용하며 프로그램이 진행됩니다.
클래스와 인스턴스
그러면 JAVA에서 어떻게 객체라는 개념을 코드로 표현하고 있을까요? 그걸 알기위해서는 우선 클래스와 인스턴스의 관계를 알아야합니다.
클래스 : 객체를 만들기 위한 '틀'
인스턴스 : 클래스라는 틀로 만들어진 '실제 객체'
최근에 유명한 넷플릭스의 오징어 게임의 달고나 게임을 기억하시는 분들이 많으실 겁니다. 달고나도구는 달고나를 반복적으로 찍어낼 수 있는 틀입니다. 이렇게 생성된 달고나를 '인스턴스'라고 칭하며, 달고나 도구를 '클래스'라고 부릅니다. 코드를 보며 실제 상황을 가정하겠습니다. 위의 그림중 강아지에 대한 클래스입니다.
// Dog.javapublicclassDog{
int gender;
int height;
int weight;
boolean adorable;
boolean cute;
Dog(){
System.out.println("Hello Im dog");
} // 객체생성자publicvoideat(){}
publicvoidbark(){}
publicvoidsleep(){}
publicvoidtailling(){}
}
JAVA에서 객체(틀)을 만들고 싶을때는 'class' 라는 예약어를 사용한 후 사용할 클래스명(여기서는 Dog)를 지정합니다. 클래스 블럭(중괄호로 둘러쌓인 부분)에는 변수선언(멤버선언), 매서드선언(행위선언)을 할 수 있습니다.
중간에 System.out.println("Hello Im dog");가 보입니다. 이 출력문은 생성자이름인 Dog의 함수블럭에 존재하는데요. 이것은 매서드가 아닌 '생성자' 라고 불리웁니다.
이 Dog틀롤 인스턴스를 만드는것을 예시로 보면서 생성자 이야기를 계속하겠습니다. 아래는 Dog틀을 이용해서 새로운 강아지 bagGu와 hwangGu를 만드는 코드입니다.
// DogTest.javapublicclassDogTest{
publicstaticvoidmain(String[] args){
Dog bagGu;
Dog hwangGu = new Dog();
}
}
Dog라는 '틀'은 자료형이 됩니다. 우리가 지난 시간 알아보았던 기본자료형또한 '틀'이고요. 따라서 변수를 선언하듯이
<자료형> [사용할 변수명] 의 형태로 인스턴스를 만들 수 있습니다. 이렇게만 하면 변수를 사용할 것이라는 '선언'만 진행한것입니다. '초기화'를 위해서는 'new' 라는 예약어를 이용합니다. 위 코드에서는 new Dog()가 될것입니다. 코드를 실행시켜보면 콘솔창에 다음과 같은 결과가 나올것입니다.
Hello Im dog
이 'Hello Im dog'는 Dog hwangGu = new Dog();에서 출력된 코드입니다. 객체가 인스턴스가 될 때는 생성자가 호출이됩니다. 따라서 객체코드의 Dog(){ System.out.println("Hello Im Dog")}가 실행된 것입니다.
이번시간에는 객체와 인스턴스, 생성자에 관하여 간단하게 알아보았습니다. 다음시간에는 생성자의 활용법과 객체사용법을 조금더 알아보는 시간을 가지겠습니다!
그렇습니다. 3명을 사용하는데 코드의길이가 많이 깁니다. 문제는 여기서 그치지 않고 학생이 10명, 100명으로 늘어나는 순간, 이 프로그램의 코드는 말도 안 되게 길어지는 단점이 발생합니다. 반복적인 일을 하고 있는데도, 심지어 반복문도 제대로 이용을 못하고 있지요, 이를 위해서 배열이 사용됩니다. 문법적으로 먼저 만나보겠습니다.
그렇습니다. 배열은 한가지종류의 자료형만을 받습니다. 같은 배열에 int, String이 같이 있을 수는 "아직"없습니다. 자료형 뒤에 대괄호[]를 사용한 후 변수 이름을 지정하고, 초기화를 해도 좋고 안 해도 좋습니다. 아래의 코드를 보겠습니다.
// Students.javapublicclassStudents{
publicstaticvoidmain(String[] args){
String[] students = {"철수","영희","민수"}; //배열의 선언과 초기화 동시진행 동시에 크기는 3//String[] students = new String[3] //배열의 크기만 잡아줌
System.out.println("student1 : "+students[1]); //배열요소의 접근은 [인덱스]로 시행
students[0] = "영수";
System.out.println("\n 배열의 크기 : "+students.length); // 배열의 크기출력for(int i=0;i<3;i++){
System.out.println("Student : "+students[i]);
}
}
}
코드를 통해본 배열의 특징은 다음과 같습니다.
배열요소의 접근은 배열 변수[인덱스]로 접근함
인덱스는 0부터 시작. 즉 배열의 크기가 5라면 0~4까지가 배열의 인덱스가 됨(0이 첫 번째 요소)
위를 이용해서 반복문의 효율적인 사용이 가능
배열에 사용되는 자료형은 아무 자료형이나 가능하며, 배열의 크기만 잡아준 주석처리 코드처럼 아무 값도 배열에 부여하지 않은 경우 배열의 요소는 null이 됩니다. 자주 사용하는 프로퍼티로 배열 이름. length를 하면 배열의 크기가 출력됩니다.
이번 시간에는 기본자료구조인 배열에 대해서 알아보았습니다! 다음 시간에는 JAVA를 JAVA 답게 만들어주는, 객체 재향이라는 프로그래밍 기법에 빠질 수 없는 클래스에 대해서 알아보겠습니다!
컴퓨터가 인간보다 뛰어난 것, 그중 하나는 엄청난 연산능력과 함께 반복되는 일을 불평하지 않고 처리한다는 점일 겁니다. 프로그래밍에는 이러한 컴퓨터의 특징을 살려 "반복"을 지정하는 특별한 문법을 언어마다 제공하고 있습니다. 이번 시간 우리는 JAVA에서의 반복문의 문법과 사용방법을 알아보도록 하겠습니다.
* 본 포스팅은 Advanced for를 다루고 있지 않습니다.
for문
반복문의 대표주자, 사실 for문만 잘 쓸 줄 알아도 프로그래밍 언어에서 반복에 관한 흐름 제어를 하는 것은 누워서 떡먹기입니다. 문법부터 살펴보겠습니다.
오호; 뭐가 문법적인 의미를 담고 있는 낯선 단어들이 보입니다. 위의 뜻은 아래와 같습니다.
"초기값부터, 증감을 하며 조건에 맞을 때동안 반복 내용을 실행하라"
사용 예시로 확인해 보겠습니다. 아래는 1부터 100까지 더하고 그 결과를 출력하는 JAVA코드입니다.
// SumToHund.javapublicclassSumToHund{
publicstaticvoidmain(String[] args){
int sum=0; // 결과저장값 sum, 0으로 초기화 합니다.int i=0; // 반복자로 사용할 반복변수for(i=1;i<=100;i++){ //i가 1부터 i++을 해나가면서(1씩 증가) i가 100보다 작거나 같을동안 실행
sum += i; // sum에 i를 더함
}
System.out.println("Total result of sum Hundred : "+sum);
}
}
//출력
Total result of sum Hundred : 5050
위의 코드 SumToHund.java를 통해서 FOR의 용법을 살펴보았습니다! 반복자의 이름은 꼭 i가 아니어도 되며, 반복자 변수 선언은 아래와 같이 for문 안에서도 가능하다는 점(이게 훨씬 간결합니다!) 알아두시기 바랍니다!
// SumToHund2.javapublicclassSumToHund2{
publicstaticvoidmain(String[] args){
int sum=0;
for(int i=1;i<=100;i++){ //for문에서 반복자 변수 선언
sum += i;
}
System.out.println("Total result of sum Hundred : "+sum);
}
}
while문, do~while문
보다 간단한 반복문도 존재합니다. 바로 조건만 지정하여, 조건이 참인동안 반복문을 실행하는 while문인데요, 사용 문법은 아래와 같습니다.
코드 예시로 자세하게 알아보겠습니다.
// WhileToHund.javapublicclassWhileToHund{
publicstaticvoidmain(String[] args){
int sum=0; // 결과저장값 sum, 0으로 초기화 합니다.int index = 100;
while(index>0){ // for문과 다르게 조건만지정, 이 반복문은 index가 0이상인 한 계속실행된다.
sum += index;
index--; // sum에 index를 더한 이후 index를 빼주는 코드줄
}
System.out.println("Total sum of Hund : "+sum);
}
}
// 출력
Total sum of Hund : 5050
while은 무조건 한 번은 실행되게 할 수 있는 변형 문법이 존재합니다! 바로 do~while문법인데요
// DoWhileToHund.javapublicclassDoWhileToHund{
publicstaticvoidmain(String[] args){
boolean trigger = false;
while(trigger){ // while문 조건에 false를 넣은 경우, while은 아예 실행되지 않는다.
System.out.print("FASLE OUTPUT from WHILE");
}
do{ // do while문 조건에 false를 넣은 경우, do while은 거짓이더라도 한번은 실행된다.
System.out.print("FASLE OUTPUT from DO WHILE");
}while(trigger);
}
}
//출력
FASLE OUTPUT from DO WHILE
do while문 끝에 문장끝을 의미하는 세미콜론(;)에 유의해 주세요!
반복 제어(break, continue)
반복문을 실행하는 도중 특별한 상황이 되면, 반복문을 종결하거나 일정한 반복문은 건너뛰고 싶은 경우도 있을 것입니다. 이를 위한 반복문 내부에서만 쓸 수 있는 특별한 키워드가 있는데요, 바로 break문과 continue문입니다.
break의 예시부터 보겠습니다.
// BreakExample.java// 1~50까지 더하는 경우, 100까지 루프를 돌지만 50이 되면 반복을 그만둔다.publicclassBreakExample{
publicstaticvoidmain(String[] args){
int sum=0;
for(int i=1;i<=100;i++){
sum += i;
if(i==50){
break; // break는 가장 가까이 있는 반복문을 탈출한다.
}
}
System.out.println("탈출한 반복문은 여기로 : "+sum);
}
}
//출력
탈출한 반복문은 여기로 : 1275
break를 이용해서 100까지 돌아야되는 루플을 i가 51일 때 탈출한 코드 예시입니다. 다음은 continue의 문법을 보도록 하겠습니다.
* for문 마지막에 설명한것 처럼, 반복문 문법 안에서 반복자를 선언할 수 있습니다.
// ContinueExample.java// 1~100까지의 홀수를 더하는 경우, 짝수인 경우 다음 스텝으로 넘어간다.publicclassContinueExample{
publicstaticvoidmain(String[] args){
int sum=0;
for(int i=1;i<=100;i++){
if(i%2==0){
continue;
}
sum += i;
}
System.out.println("ODD SUM : "+sum);
}
}
//출력
ODD SUM : 2500
위의 코드는 1~100까지 홀수만을 더하여 출력하는 코드입니다. 반복문 for안의 조건문(if)으로 i를 2로 나눈 결과가 0인(짝수)인 경우 continue를 통해서 다음 루프 스텝으로 강제 이동하도록 하였습니다. 이경우 continue아래 있는 코드는 자연스럽게 무시됩니다.
무한루프
루프의 경우 강제로 끝나지 않는 루프를 생성할 수 있습니다. 이렇게 생성되는 경우를 무한루프라고 부르는데요, 보통 사용자의 입력을 기다리고 있거나, 프로그램이 백그라운드에서 계속실행되어야하는경우, 내부적으로 이 "무한루프"가 어딘가에 구현되어있는것을 알 수 있습니다 아래는 무한루프의 예시입니다. while조건에 true를 정적으로 대입하여 무조건 루프를 실행하게 하였습니다.
// InfiniteLoop.java// 무한히 I LOVE JAVA를 출력하는 코드publicclassInfiniteLoop{
publicstaticvoidmain(String[] args){
while(true){
System.out.println("I LOVE JAVA!");
}
}
}
//출력
I LOVE JAVA!
I LOVE JAVA!
I LOVE JAVA!
I LOVE JAVA!
...
I LOVE JAVA!
I LOVE JAVA!
I LOVE JAVA!
...
이번시간에는 JAVA에서 사용하는 반복문인 for, while, do~while과, 반복제어문인 break, continue 또한 무한루프의 개념과 사용방법까지 알아보았습니다. 다음시간에는 배열에 대해서 알아보도록 하겠습니다!