Microsoft Windows [Version 10.0.19045.4291] (c) Microsoft Corporation. All rights reserved.
C:\Users\PC-06>cd ..
C:\Users>cd workspace_python 지정된 경로를 찾을 수 없습니다.
C:\Users>cd ..
C:\>cd workspace_python
C:\workspace_python>dir C 드라이브의 볼륨에는 이름이 없습니다. 볼륨 일련 번호: 0234-61D5
C:\workspace_python 디렉터리
2024-04-15 오전 10:14 <DIR> . 2024-04-15 오전 10:14 <DIR> .. 2024-04-15 오전 10:17 109 hello.java 2024-04-15 오전 10:10 21 hello.py 2개 파일 130 바이트 2개 디렉터리 170,882,846,720 바이트 남음
C:\workspace_python>hello.java
C:\workspace_python>javac hello.java hello.java:5: error: package system does not exist system.out.println("hello java"); ^ 1 error
package kr.or.ddit.basic;
public class DocTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("안녕하세요....");
JavaDocTest test = null;
test.methodInput();
}
}
package kr.or.ddit.basic;
// JavaDoc문서 작성 예제
/* 이것도 주석의 한 예 */
/**
*
* @author PC-13
* @version 1.0
*
* <p>
* javaDoc 주석 안에서는 HTML 태그를 이용하여 내용을 작성한다.<br>
* --------------------------------------------<br>
* 파일명 : JavaDocTest.java<br>
* 설 명 : JavaDoc문서 작성을 위한 연습용 interface<br><br>
*
* 변경 이력<br>
* -------------------<br>
* 변경 일자 : 2024-03-11<br>
* 변경인 : 홍길동<br>
* 변경내용 : 최초 생성<br>
* -------------------<br>
*
* </p>
*
*/
public interface JavaDocTest {
/**
* 메서드명 : methodTest<br>
* 설명 : 반환값이 없는 메서드<br><br>
* @param a 첫번째 매개변수(정수형)
* @param b 두번째 매개변수(정수형)
*/
public void methodTest(int a, int b);
/**
* 메서드명 : methodAdd<br>
* 설명 : 반환값이 있는 메서드<br><br>
* @param x 첫번째 정수형 변수
* @param y 두번째 정수형 변수
* @return 처리된 결과를 정수형으로 반환한다.
*/
public int methodAdd(int x, int y);
/**
* 메서드명 : methodInput<br>
* 설명 : 매개변수가 없고 반환값만 있는 메서드<br><br>
* @return 정수형값이 반환된다.
*/
public int methodInput();
}
MVC (Model, View, Controller)패턴 -MVC패턴의 비지니스 로직을 처리하는 클래스들 VO, DTO ==> 데이터를 저장하는 역할만 하는 클래스 ( VO => Value Object, DTO => Data Transfer Object) DAO ==> SQL문을 DB서버에 보내서 결과를 얻어오는 역할을 수행하는 클래스 (DAO => Data Access Object ) service ==> 일을 수행하는 중간관리자와 같은 역할을 수행하는 클래스 Service는 일이 있으면 그 일에 필요한 DAO를 호출해서 일을 처리한 후 처리 결과를 받아서 Controller에게 전달한다. Controller ==> 비지니스 로직이 시작되는 곳으로 사용자의 요청이 오면 그 요청에 맞는 Service에게 일을 시키고, Service가 보내온 처리결과를 화면등에 반영시키는 역할을 수행한다.
DAO부터 만드는게 좋다 .
package kr.or.ddit.mvc.vo;
/*
DB테이블에 있는 컬럼을 기준으로 데이터 객체화할 클래스
DB테이블의 '컬럼명'이 이 클래스의 '멤버변수'가 된다.
DB테이블의 컬럼과 클래스의 멤버변수를 매핑하는 역할을 수행한다.
*/
public class MemberVo {
private String mem_id ;
private String mem_pass;
private String mem_name;
private String mem_tel;
private String mem_addr;
public MemberVo(String mem_id, String mem_pass, String mem_name, String mem_tel, String mem_addr) {
super();
this.mem_id = mem_id;
this.mem_pass = mem_pass;
this.mem_name = mem_name;
this.mem_tel = mem_tel;
this.mem_addr = mem_addr;
//VO클래스에 별도의 생성자를 만들때에는 기본 생성자도 반드시 같이 만들어준다.
}
public String getMem_id() {
return mem_id;
}
public void setMem_id(String mem_id) {
this.mem_id = mem_id;
}
public String getMem_pass() {
return mem_pass;
}
public void setMem_pass(String mem_pass) {
this.mem_pass = mem_pass;
}
public String getMem_name() {
return mem_name;
}
public void setMem_name(String mem_name) {
this.mem_name = mem_name;
}
public String getMem_tel() {
return mem_tel;
}
public void setMem_tel(String mem_tel) {
this.mem_tel = mem_tel;
}
public String getMem_addr() {
return mem_addr;
}
public void setMem_addr(String mem_addr) {
this.mem_addr = mem_addr;
}
@Override
public String toString() {
return "MemberVo [mem_id=" + mem_id + ", mem_pass=" + mem_pass + ", mem_name=" + mem_name + ", mem_tel="
+ mem_tel + ", mem_addr=" + mem_addr + "]";
}
}
package kr.or.ddit.mvc.dao;
import java.util.List;
import kr.or.ddit.mvc.vo.MemberVo;
/**
* 실제 DB서버와 연결해서 SQL문을 수행하여 결과를 작성하여
* Service에게 전달하는 DAO의 interface
*
* DAO의 메서드 하나가 DB와 관련된 작업 1개를 수행하도록 작성한다.
*
* @author PC-06
*
*/
public interface IMemberDao {
/**
* MemberVo객체에 담겨진 자료를 DB에 insert하는 메서드
* @param memVo DB에 insert할 자료가 저장된 MemberVO객체
* @return insert 작업성공:1, insert 작 업실패:0
*/
public int insertMember(MemberVo memVo);
/**
* 회원 ID를 매개변수로 받아서 해당회원 정보를 삭제하는 메서드
* @param memId 삭제할 회원 ID
* @return 작업성공:1, 작업 실패 :0
*/
public int deleteMember(String memId);
/**
* 매개변수로 받은 MemverVo객체를 이용하여 DB에 update하는 메서드
*
* @param memVo update할 회원 정보가 저장된 MemberVo메서드
* @return 작업성공 : 1 , 작업 실패 :0
*/
public int updateMember(MemberVo memVo);
/**
* DB의 전체 회원 정보를 가져와서 List에 담아서 반환하는 메서드
*
* @return 전체 MemberVo객체가 저장된 List
*/
public List<MemberVo>getAllMember();
/**
* 회원 ID를 매개변수로 받아서 해당 회원ID의 개수를 반환하는 메서드
* @param memid 검색할 회원ID
* @return 검색된 회원ID의 개수
*/
public int getMemberIdCount(String memid);
}
package kr.or.ddit.mvc.service;
import java.util.List;
import kr.or.ddit.mvc.dao.IMemberDao;
import kr.or.ddit.mvc.dao.MemberDaoImpl;
import kr.or.ddit.mvc.vo.MemberVo;
public class MemberServiceimpl implements IMemberService {
private IMemberDao dao; //DAO객체가 저장될 변수 선언
//생성자
public MemberServiceimpl() {
dao = new MemberDaoImpl(); //DAO 객체 생성
}
@Override
public int insertMember(MemberVo memVo) {
// TODO Auto-generated method stub
return dao.insertMember(memVo);
}
@Override
public int deleteMember(String memId) {
return dao.deleteMember(memId);
}
@Override
public int updateMember(MemberVo memVo) {
// TODO Auto-generated method stub
return dao.updateMember(memVo);
}
@Override
public List<MemberVo> getAllMember() {
// TODO Auto-generated method stub
return dao.getAllMember();
}
@Override
public int getMemberIdCount(String memid) {
// TODO Auto-generated method stub
return dao.getMemberIdCount(memid);
}
}
+ 연산자와 - 연산자는 이항 연산자로서 덧셈과 뺄셈을 의미하지만, 피연산자가 하나인 단항 연산자로서 부호를 뜻하기도 한다. 이는 +3, -7과 같이 숫자 앞에 붙는 부호를 뜻하는 것이므로 생소하지 않을 것이다. 이와 관련한 예제를 보자
<OperatorThree.c>
#include <stdio.h> int main(void) { int num1= +2; int num2= -4; num1 = -num1; printf("num1 : %d \n", num1); num2 = -num2; printf("num2 : %d \n", num2); return 0; }
참고
부호 연산자가 삽입된 문장과 복합 대입 연산자가 삽입된 문장을 혼동하는 경우가 있다. 다음과 같이 연산자와 피연산자 사이에 공백을 삽입하지 않는 경우에는 더욱 혼동하기가 쉽다.
num1 =-num2; // 부호 연산자의 사용 num1-=num2; // 복합 대입 연산자의 사용
따라서 모든 경우에 연산자와 피연산자 사이에 공백을 두지는 않더라도, 위의 두 경우에 한해서는 다음과 같이 공백을 두는 것이 혼란을 최소화할 수 있는 방법이 된다.
num1 = -num2; //부호 연산자의 사용 num1 -= num2; //복합 대입 연산자의 사용
증가, 감소 연산자
연산자
연산자의 기능
결합방향
++num
값을 1 증가 후, 속한 문장의 나머지를 진행(선 증가, 후 연산) 예)val = ++num;
←
num++
속한 문장을 먼저 진행한 후, 값을 1 증가(선 연산, 후 증가) 예)val = num
→
--num
값을 1 감소 후, 속한 문장의 나머지를 진행(선 감소, 후 연산) 예)val = --num;
←
num--
속한 문장을 먼저 진행한 후, 값을 1 감소(선 연산, 후 감소) 예)val= num--;
→
++ 연산자와 -- 연산자는 이름 그대로 값을 1 증가 및 감소 시키는 연산자이다. 그런데 이 두 연산자는 삽입된 위치에 따라서 그 의미가 달라진다. 피연산자의 왼편에 붙는 경우에는 (++num, --num), 먼저 변수에 저장된 값을 증가 및 감소 시키고 나서 문장의 나머지 부분을 실행하게 된다. 반면, 피연산자의 오른쪽에 붙는 경우에는 (num++ , num--), 문장 전체를 실행한 다음에 값을 증가 및 감소 시키게 된다.
<OperatorFour.c>
#include <stdio.h>
int main(void) { int num1 = 12; int num2 = 12; printf("num1: %d \n", num1); printf("num1++: %d \n", num1++); // 후위 증가 printf("num1: %d \n\n", num1);
위 예제 int num2=(num1--)+2;에서는 변수 num1에 대해서 '선 연산, 후 감소'를 진행하고 있다. 그런데 이 연산의 앞과 뒤에 소괄호가 채워져 있다. C언어에서는 소괄호도 연산자이다. 그리고 이는 수학의 소괄호와 의미가 같다. 즉, 먼저 연산하라는 뜻이다.
후위증가 및 후위 감소 연산시에는 '소괄호의 영향을 받지 않고, 다음 문자으로 넘어가야만 비로소 값의 증가 및 감소가 이뤄진다'
관계 연산자 ( <, >, ==, !=, <=, >=)
관계 연산자는 대소와 동등의 관계를 따지는 연산자이다. '비교 연산자'라고도 한다. 두개의 값을 비교하기 때문이다.
연산자
연산자의 기능
결합방향
<
예) n1 < n2 n1이 n2보다 작은가?
→
>
예) n1 > n2 n1이 n2보다 큰가?
→
==
예) n1 == n2 n1보다 n2가 같은가?
→
!=
예) n1 != n2 n1과 n2가 다른가?
→
<=
예) n1 <= n2 n1이 n2보다 같거나 작은가?
→
>=
예) n1 >= n2 n1이 n2보다 같거나 큰가?
→
위의 관계 연산자들은 '조건을 만족하면 1을, 만족하지 않으면 0을 반환'한다. 그런데 여기서 말하는 1은 '참(True)'을, 0은 '거짓(False)'을 의미하는 대표적인 숫자이다. 따라서 다음과 같이 이야기하는 것이 더 일반적이다.
"조건을 만족하면 '참(true)'을, 만족하지 않으면 '거짓(false)'을 반환한다.
이와 관련한 예제를 보자
<OperatorSix.c>
#include <stdio.h>
int main(void) { int num1 = 10; int num2 = 12; int result1, result2, result3; result1 = (num1==num2); result2 = (num1<=num2); result3 = (num1>num2);
result3 = (!num1); 이 문장은 논리 NOT 연산의 예를 보여준다. 따라서 num1에 1이 저장되어 있다면 result3에는 0이 저장되고, num1에 0이 저장되어 있다면 result3 에는 1이 저장된다. 그렇다면 0도 1도아닌 다른 값이 저장되어 있다면 result3에는 어떤 값이 저장되겠는가? 이와 관련해서 다음 사실을 알 필요가 있다.
"C언어는 0이 아닌 모든 값을 '참(true)'으로 간주 한다.
즉, '거짓'을 의미하는 숫자는 유일하게 0 하나이고, 0이 아닌 모든 숫자는 '참'으로 인식된다. 다만, 그중에서도 '참'을 의미할 때 주로 사용되는 숫자가 1이고, 그래서 연산의 결과로 '참이' 반환되어야 할 떄 1이 반환되는 것 뿐이다. 그리하여서 result3에 0이 저장이 된 것이다.
콤마 연산자( , )
콤마 연산자는 둘 이상의 변수를 동시에 선언하거나, 둘 이상의문장을 한 행(line)에 삽입하는 경우에 사용되는 연산자이다. 뿐만 아니라, 둘 이상의 인자를 함수로 전달할 때도 인자의 구분을 목적으로 사용된다. 즉, 콤마 연산자는 다른 연산자들과 달리, 연산의 결과가 아닌 '구분'을 목적으로 주로 사용된다.
여기서 말하는 쓰레기 값이란 '아무런 의미가 없는 값'을 뜻한다. 가급적 이러한 쓰레기 값이 변수에 저장되지 않도록 하는 것이 좋다.
변수선언 시 주의할 사항
중괄호 내에 변수를 선언할 경우, 변수의 선언문은 중괄호의 앞부분에 위치해야 한다.
C언어에서의 중괄호는 영역이나 내용을 구분하는 목적으로 사용된다. 중괄호의 시작부분에 변수의 선언문이 위치해야 한다.
다음과 같은 코드는 컴파일 에러를 발생시키지 않는다.
int main(void) { int num1; int num2; num1=0; // 변수선언 이후에 등장한 초기화 문장 num2=0; // 변수선언 이후에 등장한 초기화 문장 }
변수 num1과 num2의 선언문 앞에 다른 어떠한 문장도 존재하기 않기 때문에 컴파일 에러를 발생시키지 않는다.
하지만 다음과 같은 코드는 컴파일 에러를 발생시킨다.
int main(void) { int num1; num1=0; //이 문장은 변수의 선언문이 아니다. int num2; // 컴파일 에러가 발생하는 지점 num2=0; }
위의 경우는 변수 num2의 선언문 앞에 변수의 선언이 아닌 문장이 등장했기 때문에 컴파일 에러가 발생한다. 따라서 중괄호의 앞부분에 변수의 선언문이 오도록 해야 한다. 참고로 1999년도에 발표된 C언어의 표준에서는 변수의 선언위치에 아무런 제한을 두고 않고 있다. 따라서 위의 코드도 컴파일이 되어야 정상이지만 최근에 발표된 컴파일러를 비롯해서, 아직도 상당수의 컴파일러가 변수의 선언문이 중괄호의 앞부분에 일치할 것을 요구하고 있다.
변수 선언시 주의해야 할 두 번째 사항은 변수의 이름에 관한 것이다. 다음은 변수의 이름을 지을 때 적용되는 규칙들이다.
첫째 변수의 이름은 알파벳, 숫자, 언더바(_)로 구성된다.
둘째 C언어는 대소문자를 구분한다. 따라서 변수 Num과 변수 num은 서로 다른 변수이다.
셋째 변수의 이름은 숫자로 시작할 수 없고, 키워드도 변수의 이름을 사용할 수 없다.
넷째 이름 사이에 공백이 삽입될 수 없다.
변수의 이름을 정할 때에는 변수의 역할에 어울리는, 의미 있는 이름을 지어야한다.
예를 들어, 나이를 저장할 목적의 변수를 선언하는 경우, 변수의 이름으로는 age가 num보다 더 잘 어울린다.
이렇듯 용도를 파악할 수 있는, 의미 있는 이름을 지어주려고 노력해야한다. 그래야 이해하기 쉬운 , 분석이 용이한 프로그램이 되기 때문이다.
변수의 자료형(Data Type)
변수는 다음과 같이 크게 두가지 부류로 나뉜다
정수형 변수 : 정수의 저장을 목적으로 선언된 변수
실수형 변수: 소수점 이하의 값을 지니는 실수의 저장을 목적으로 선언된 변수
변수의 종류가 크게 두 가지로 나뉘는 이유는 정수냐, 실수냐에 따라서 값이 메모리 공간에 저장 및 참조되는 방식이 다르기 때문이다. 그리고 정수형 변수는 변수의 크기에 따라서 char형, short형, int형, long형 변수로 나뉘고, 실수형 변수도 크기에 따라서 float형 변수와 double형 변수로 나뉜다.
덧셈 프로그램의 완성
예제 SimpleAddOne.c를 덧셈 프로그램으로 변경해보고자한다. 두변수에 저장된 값을 대상으로 덧셈을 진행하고, 그 결과를 변수에 저장해서 다양한 형태로 출력해보겠다.
#include <stdio.h>
int main(void) { int num1=3; int num2=4; int result=num1+num2;
C언어에서는 x에 삽입되는 값을 '입력'하고, 그 결과로 얻게 되는 y의 값을 '출력'이라고 한다. 그리고 적절한 입력과 그에 따른 출력이 존재하는 것을 가리켜 '함수(function)'이라 한다.
C언어에서 함수와 관련해서 사용되는 용어 몇 가지 정리 !
함수의 정의 : 만들어진 함수, 실행이 가능한 함수를 일컬음
함수의 호출 : 함수의 실행을 명령하는 행위
인자의 전달 : 함수의 실행을 명령할 때 전달하는 입력 값
예제 Hello.c에서의 함수는 어디에?
C프로그램은 함수로 시작해서 함수로 끝난다. 즉, 정해진 순서에 의해서 진행되는 함수의 호출이 바로 프로그램의 흐름이 되는 것이다. 그렇다면 제일 먼저 호출되는 함수는 무엇일까? 바로 main이라는 이름의 함수이다. 프로그램이 실행되자마자 컴퓨터는 main이라는 이름의 함수를 찾아서 호출을 한다. 따라서 C언어로 구현된 모든 프로그램에는 main이라는 이름의 함수가 정의되어야 한다.
int
main
(void)
출력형태
함수이름
입력형태
위의 표가 의미하는 바는 다음과 같다.
출력의 형태가 int이고 입력의 형태가 void인 main이라는 이름의 함수
이렇듯 함수의 특성(입력형태, 출력형태 그리고 함수 이름)만 정의했다고 해서 함수가 되는 것은 아니다. 함수는 기능을 지녀야한다.
맨위 예제의 중괄호 내부는 두 개의문장으로 이뤄져 있는데, 이 문장들은 순차적으로 실행이 된다. 즉, 중괄호내에 존재하는 문장은 그 수에 상관없이 위에서 아래로 순차적으로 실행이 된다.
이렇게 함수의 기능을 정의하고 있는 영역을 가리켜 '함수의 몸체(body)'라 한다.
함수 내에 존재하는 문장의 끝에는 세미콜론 문자 ; 을 붙여준다.
main의 함수의 몸체는 다음 두 문장으로 이뤄져 있다.
printf("Hello world! \n");
return 0;
각 문장 끝에는 세미콜론 문자 ; 가 붙어있다. 이렇듯 C언어는 문장의 끝을 표현하기 위해서 세미콜론을 사용한다. 그런데 모든 문장에 세미콜론이 붙는 것은 아니고 조건문이나 반복문 같은 컨트롤 문장에는 세미콜론이 붙지 않는다.
표준 라이브러리와 printf 함수
main 함수의 몸체에는 다음 문장이 존재한다.
printf("Hello world! \n");
함수의 호출문에서 소괄호 안에는 함소호출 시 전달할 인자정보를 표현한다. 그리고 C언어는 큰따옴표를 이용해서 문자열을 표현한다. 즉, 위 문장은 문자열 "Hello world! \n"을 인자로 전달하면서 printf라는 이름의 함수를 호출하는 문장이다.
printf 함수는 함수 호출 시 전달되는 문자열을 모니터에 출력하는 기능을 지닌다. 이러한 printf 함수는 직접 만들지 않아도 호출이 가능한, 기본적으로 제공되는 함수이다. 즉, 누구나 가져다 쓸 수 있도록 이미 만들어져 있는 함수이다. 이렇듯 제공되는 함수를 가리켜 '표준함수'라고 하고 , 표준함수들의 모임을 가리켜 '표준 라이브러리'라 한다.
현 시점에 어울리는 '헤더파일 선언의 필요성'에 대한 설명
printf 와 같은 표준함수의 호출을 위해서는 printf 함수와 관련 있는 '헤더파일 선언'이라는 것을 해야한다. 앞서 보인 예제의 헤더파일 선언은 #include <stdio.h> 이다.
이는 stdio.h라는 , 확장자가 .h로 끝나는 헤더파일을 포함하라는 의미의 선언이다.
printf 함수의 호출을 위해서는 stdio.h를 대상으로 헤더파일 선언을 해야 한다.
헤더파일의 선언은 소스파일의 맨 앞 부분, main 함수 정의 이전에 와야 한다.
return은 함수의 종료와 값의 전달(반환)이라는 두 가지 의미를 지닌다.
main 함수의 다음 두 번째 문장은 return 0;이다
이를 가리켜 return문이라 하는데, 이 문장이 지니는 두가지 의미는 다음과 같다.
함수를 호출한 영역으로 값을 전달(반환)
현재 실행중인 함수의 종료
따라서 예제 Hello.c에서는 이 문장을 실행하면서 main 함수를 호출한 영역으로 0을 전달한다. 그리고 함수를 빠져 나온다. 그런데 main 함수의 종료는 프로그램의 종료로 이어지기 때문에 결국 프로그램이 종료가 된다.
참고- main 함수의 return문
main 함수의 마지막에서 0을 전달(반환)하는 이유는 무엇일까 ? 이값은 main 함수를 호출한 영역으로 전달된다. 그런데 main 함수는 프로그램이 시작되면 자동으로 호출되는 함수이다. 그리고 호출의 주체는 Window나 Linux와 같은 운영체제이다. 따라서 0은 운영체제에게 전달된다. 그리고 그 값은 프로그램의 종료상태를 알리는 용도로 사용된다. 보통 0은 정상적인 종료의 상황에서 전달하는 값이다. 반면 비정상적인 상황으로 인해서 종료될 때에는 일반적으로 0이 아닌 값을 전달한다.
문제 02-1 [예제 변경해보기]
문제1 : 다음과 같은 형태로 본인의 이름을 출력하는 프로그램을 작성해 보자. 단, printf 함수는 한 번만 호출해야 한다.
홍길동
홍 길 동
홍 길 동
문제2: 본인의 이름, 주소 그리고 전화번호를 모니터에 출력하는 프로그램을 작성해 보자. 더불어 이스케이프 시퀀스 \n 을 적절히 삽입해서 출력형태로 보기 좋게 다듬기 바란다. 총 3번 printf 함수를 호출해서 문제를 해결하자.