dataGridView1.CellValueChanged += dataGridView1_CellValueChanged;


void dataGridView1_CellValueChanged(object sender, EventArgs e)
            {
                int rowIndex = dataGridView1.CurrentCell.ColumnIndex;
                if (dataGridView1.Columns[rowIndex].HeaderText == "Column2")
                {
                    MessageBox.Show("success");
                }
            }

Column에서 Enter키나 Tab 키를 눌렀을 때 Column의 Header Text를 비교 한 뒤 해당 하는 Cell이면

메시지 박스에 success 출력

 

DataGridView 셀의 값에 변경 내용을 검색 하려면

 CellValueChanged 이벤트

 

DataGridView 셀의 상태 변경을 감지 하려면

 CellStateChanged 이벤트

 

java.lang.NoClassDefFoundError: org/apache/jsp 에러에 대해서 알아보자


결론부터 말하자면 jsp파일을 컴파일 하고 저장된 java파일과 class파일의 이름이 jsp파일의 이름을 바꿨는데도 시스템에서 수정되지 않아 생기는 오류이다.

에러를 자세히 보면 jsp 폴더 안에 있는 board/boardWrite_jsp 파일이 wrong name: org/apache/jsp/board/BoardWrite_jsp 

즉,  잘못된 이름의 파일이 저장되어 있다는 뜻으로 해석 가능하다. 이를 해결하기 위해 



서버를 더블 클릭 한뒤



그림과 같이 Open launch configuration을 클릭.



Arguments를 클릭 한 뒤 Dctalina. base나 Dctalina.home 의 파일 경로를 복사 한뒤 파일을 열어 붙여 넣기 한다.

그러고 난뒤 work->Catalina -> localhost -> 자신이 하고 있는 프로젝트명의 파일 -> org -> apache -> jsp  순으로 파일을 이동한다.

C:\Users\kim\Downloads\apache-tomcat-9.0.10\apache-tomcat-9.0.10\work\Catalina\localhost\start_project\org\apache\jsp

    빨간색 글자로 표시한 부분이 각자의 파일을 차이점이 될 것이다. 
이제 jsp 파일안에 들어있는 java파일과 class파일들을 삭제한뒤 다시 컴파일을 실행시키면 오류가 해결 될 것이다.


java.lang.NullPointerException 에러는 무엇인가?


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import java.util.Scanner;
 
public class Main {
   static Integer[][] arr = new Integer[3072][6143];
    
   public static void main(String[] args) {
       Scanner sc = new Scanner(System.in);
       int num = sc.nextInt();
       star(num-1,0,num);
       for(int i=0; i<num; i++) {
           for(int j=0; j<2*num-1; j++) {
               if(arr[i][j]==1) {
                   System.out.print("*");
               }else {
                   System.out.print(" ");
               }
           }
           System.out.println();
       }
   }
   static void star(int x, int y, int size) {
       if(size==3) {
           arr[y][x] = 1;
           arr[y+1][x-1= 1;
           arr[y+1][x+1= 1;
           
           arr[y+2][x+2= 1;
           arr[y+2][x+1= 1;
           arr[y+2][x] =1;
           arr[y+2][x-1=1;
           arr[y+2][x-2=1;
       }else {
           size /= 2;
           star(x,y,size);
           star(x-size,y+size,size);
           star(x+size,y+size,size);
       }
   }
}
 
cs


이와 같이 12번 째 줄에 NullPointerException 예외가 발생된다.

이를 해결하고자 구글에 NullPointerException 에러를 검색해봤다. 


---------------------------------------------------------------------------------------------------------------------------------------------------------------


레퍼런스 변수를 선언하면 객체의 포인터가 생성됩니다. 즉, 레퍼런스 변수는 객체의 주소 (참조값)을 저장합니다. 프리티미트 타입 (기본 타입)인 int 타입의 변수를 다음과 같이 선언한다고 가정해보면:

int x; x = 10;

이 예제의 첫번째 명령문에서 변수 x는 int 타입으로 선언되어, 자바는 이 변수의 값을 0으로 초기화합니다 (단, 변수 x가 클래스의 필드로 정의되었을 때). 그리고 두 번째 명령문과 같이 해당 변수 x에 10이라는 값을 대입 연산자를 사용하여 할당하면, 변수 이름 x가 가리키는 메모리 위치에 10이라는 값이 쓰여집니다.

그러나 레퍼런스 타입의 변수를 선언할 때는 다르게 처리됩니다. 다음의 코드를 살펴보면:

Integer num;

num = new Integer(10);

첫번째 명령문에서 num이라는 이름으로 선언된 변수는 프리미티브 값을 저장하지 않습니다. 대신, Integer라는 이름의 타입은 래퍼클래스로서, 레퍼런스타입이므로 해당 변수는 주소 (참조값)을 저장합니다. 첫번째 명령문은 아직 어떤 것을 참조하라고 정의하지 않았기 때문에 자바는 그 변수를 null로 초기화합니다 (단, 변수 num이 클래스의 필드로 정의되었을 때). 이것은 "나는 아무것도 참조하지 않아"라는 의미입니다.

두 번째 명령문은 new라는 키워드를 사용해서 Integer 클래스 객체를 생성하고 해당 객체의 주소 (참조값을) num이라는 변수에 저장합니다. 이렇게 객체를 생성하고 객체의 참조값을 저장한 변수를 사용해서 해당 객체에 접근할 수 있습니다. 이 때, . 연산자를 사용합니다.

만약 레퍼런스 타입의 변수를 선언하고 객체를 생성하지 않으면 (즉, 객체의 참조값을 해당 변수에 저장하지 않으면) Exception이 발생됩니다. 즉, 객체가 생성되기 전에 num 변수를 사용해서 해당 클래스의 객체를 접근하고자 하면 NullPointerException이 발생됩니다. 이러한 경우 대부분 컴파일러가 해당 문제를 인식해서 경로 메시지로 알려줄 것입니다. "num 변수가 아직 초기화되지 않았어"라고요.

아래와 같은 메소드에 대해서,

public void doSomething(Integer num) { // do something to num }

다음과 같이 호출한다면,

doSomething(null);

num 변수의 값은 null이 됩니다. 이러한 null 값을 가지는 num 변수를 사용해서 객체의 필드 혹은 메소드에 접근하고자 한다면 NullPointerException이 발생하게 되는 것입니다. 이와 같은 exception이 발생되지 않게 하는 최선의 방법은 다음과 같이 레퍼런스 변수를 사용하기 전에 null 값을 저장하고 있는지를 체크하는 것입니다.

public void doSomething(Integer num) { if(num != null) { // do something to num } }

-------------------------------------------------------------------------------------------------------

12번째줄의

if(arr[i][j]==1)를 if(arr[i][j]!=null) 로 고치니 문제가 해결됬다.


'프로그래밍 > JAVA' 카테고리의 다른 글

싱글턴 패턴 사용하는 이유  (0) 2019.01.06
abstract와 Interface  (0) 2019.01.04
public static void main(String[] args)  (0) 2018.11.22
java exe 파일 만들기  (0) 2018.09.01
자바 OutputStream 줄바꿈  (0) 2018.08.31

Initializing Java Tooling' has encountered a problem

오류에 대해서 알아보자.

이와 같은 에러는 프로젝트 파일을 외부에서 가져와서 import 후 사용할 경우 종종 발생한다.

해결방법은 \프로젝트폴더(workspace)경로\.metadata\.plugins\org.eclipse.core.resources\.projects의 하위폴더를 모두 삭제한 뒤 

이클립스를 재부팅하면 된다. (이때 Problems occurred while trying to save the state of the workbench라는 오류가 뜨면 OK!를 누르면 된다)


재부팅하면 아까 지웠던 .projects 폴더 내 하위폴더가 자동으로 재생성 되는데 이때 systemTemp 파일을 생성하지 못하는 경우에는 Could not write metadata for '/RemoteSystemsTempFiles' 라는 오류메시지가 또 뜨면 마지막 project 폴더에 RemoteSystemsTempFiles 이름으로 폴더를 하나 생성해주면 해결된다.


참고 : https://hunit.tistory.com/193

C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib 의 경로에 있는 파일에


ojdbc5.jar 는 Oracle 8i, 9i,& 10g  ojdbc6.jar 는 Oracle 11g이상의 버전을 의미한다.

 

JSP에서 JDBC 커넥션 풀을 설정 할 때 잘 알고 사용해야겠다.


다음은 JDBC 커넥션 풀을 설정하는 방법이다.


먼저 server.xml에서 Resource 태그를 추가한다.


driverClassName, url, username, passowrd 등은 우리가 디비 연결시 필수적으로 필요했던 항목이고

maxActive는 미리 생성해놀 커넥션의 수이다.

maxWiat의 경우 미리 생성한 커넥션 이상의 요청이 들어왔을 때 추가로 커넥션을 생성할 때 최대 기다릴 수 

있는 시간을 설정하는 것이다. 즉 timeout 을 설정

type은 커넥션을 관리하는 DataSource이다.


MemberDAO 클래스는 싱글턴 패턴(Singleton Pattern 디자인 패턴의 일종) 으로 클래스를 설계한다.


MemberDAO 클래스의 getConnection() 메소드로 커넥션 객체를 얻어내는지 확인하기 위한 테스트 JSP 파일을 만들어서 확인한다.






starting tomcat v9.0 server at localhost has encountered a problem


서버를 작동하는데 필요한 시간이 초과되어서 뜨는 오류이다.



Servers -> Tomcat v9.0 Server at localhost 를 더블 클릭해준다.



탭중에 Timeouts 를 선택하여 시간을 늘리면 된다. 20~30초 사이로 시간을 늘려보자.

https://jeong-pro.tistory.com/86

'프로그래밍 > JAVA' 카테고리의 다른 글

NullPointerException  (0) 2019.01.22
abstract와 Interface  (0) 2019.01.04
public static void main(String[] args)  (0) 2018.11.22
java exe 파일 만들기  (0) 2018.09.01
자바 OutputStream 줄바꿈  (0) 2018.08.31

http://gakari.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-Nodejs%EC%84%9C%EB%B2%84%EB%A1%9C-POST%EB%B0%A9%EC%8B%9D%EC%9C%BC%EB%A1%9C-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC-%EB%B3%B4%EB%82%B4%EA%B8%B0

Interface, Abstract

Interface

- 일종의 추상 클래스

- 오직 추상메서드와 상수만을 멤버로 갖는다.

- Implements 키워드를 사용

- 상속의 관계가 없는 클래스간 서로 공통되는 로직을 구현하여 쓸 수 있도록한다.

- Extends는 하나의 클래스만 상속 가능하나 Interface는 다중 상속이 가능하다.

Abstract

- 추상메서드를 하나 이상 가진 클래스

- 자신의 생성자로 객체 생성 불가능

- 하위 클래스를 참조하여 상위 클래스의 객체를 생성

- 하위 클래스를 제어하기 위해 사용


Abstract vs Interface

추상 클래스(Abstract)

클래스를 설계도에 비유한다면 추상클래스는 미완성 설계도에 비유할 수 있다. 미완성 설계도란, 단어

의 뜻 그대로 완성되지 못한 채로 남겨진 설계도를 말한다. 클래스가 미완성이라는 것은 멤버의 개수에

관계된 것이 아니라, 단지 미완성 메서드(추상메서드)들 포함하고 있다는 의미이다. 미완성 설계도로

완성된 제품을 만들 수 없듯이 추상클래스로 인스턴스는 생성활 수 없다. 추상클래스는 상속을 통해서

자손클래스에 의해서만 완성될 수 있다.

**자바의 정석 참고**

인터페이스 (Interface)

인터페이스는 일종의 추상클래스이다. 인터페이스는 추상클래스처럼 추상메서드를 갖지만 추상클래스 보다 추상화 정도가 높아서 추상클래스와는 달리 몸통을 갖춘 일반 메서드 또는 멤버변수를 구성원으 로 가질 수 없다. 오직 추상메서드와 상수만을 멤버로 가질 수 있으며, 그 외의 어떠한 요소도 허용하지 않는다. 추상클래스를 부분적으로만 완성된 '미완성 설계도'라고 한다면, 인터페이스는 구현된 것은 아 무것도 없고 밑그림만 그려져 있는 '기본 설계도'라고 할 수 있다. 인터페이스는 인터페이스로부터만 상속받을 수 있으며, 클래스와는 달리 다중상속, 즉 여러개의 인터페이스로부터 상속을 받는 것이 가능 하다.

**자바의 정석 참고**


공통점 

- new 연산자로 인스턴스 생성 불가능.

- 프로토타입만 있는 메서드를 갖는다.

- 사용하기 위해서는 하위클래스에서 확장/구현 해야 한다.

차이점

- 사용하는 키워드가 다르다.

- Abstract는 일반 메서드를 사용할 수 있지만, Interface는 메서드 선언만 가능하다.



출처: http://ktko.tistory.com/

'프로그래밍 > JAVA' 카테고리의 다른 글

NullPointerException  (0) 2019.01.22
싱글턴 패턴 사용하는 이유  (0) 2019.01.06
public static void main(String[] args)  (0) 2018.11.22
java exe 파일 만들기  (0) 2018.09.01
자바 OutputStream 줄바꿈  (0) 2018.08.31

함수 호출시 메모리를 통으로 복사해서 사용하면 너무 느리니깐요. 메모리 위치만 주고 받으면 빠르죠.


포인터란 자료가 저장되는 기억장치의 기억주소를 가리키는 지시자로써 포인터는 다른 기억장소의 자료를 참조하는데 사용되는 데이터입니다.

 

1. 포인터를 써야 하는 이유

 

어떠한 변수이든지 어떠한 버퍼를 할당 받아서 사용하는데모든 변수의 저장과 참조는 변수가 저장될 혹은 저장된 주소를 알아야 가능하다그래서 컴퓨터는 변수를 참조할 때 그 변수가 저장되어 있는 주소를 먼저 찾아내고 그 주소가 가리키는 내용을 참조하게 된다이렇게 변수의 주소를 저장하거나 사용하기 위한 변수가 포인터이다.

포인터를 사용하면 간결하고 효율적인 표현과 처리가 가능하고 더 빠른 기계어 코드를 생성할 수 있으며복잡한 자료 구조(배열구조체 등)와 함수의 쉬운 접근이 가능하다또한 포인터를 사용하지 않았을 때 코드로 표현할 수 없는 경우가 생길 수 있다.

 

2. 포인터를 사용하면 어떤 장점이 있을까?

 

메모리 주소를 참조해서 다양한 자료형 변수들의 접근과 조작 용이


예제_

#include <stdio.h>

int main() 

int a=5; 

int *b; 

b = &a; 

printf("a = %d, &a = %d, b = %d, *b = %d\n", a, &a, b, *b); 

*b += 5; 

printf("a = %d, &a = %p, b = %p, *b = %d\n", a, &a, b, *b); 

              return 0; 

}


-----------------------------------------------------------------------

a = 5, &a = 1245052, b = 1245052, *b = 5 

a = 10, &a = 0012FF7C, b = 0012FF7C, *b = 10


위 예제에서 보면 정수형 변수 a 5로 초기화되고 정수형 포인터 변수 b a의 시작주소가 대입됩니다

따라서 주소 b가 가리키는 내용인 *b 3이 될 것입니다이렇듯이 변수들의 접근에 용이합니다.

 

메모리 주소를 참조하여 배열과 같은 연속된 데이터에 접근과 조작 용이

동적 할당된 메모리 영역(힙 영역)에 접근과 조작 용이

한 함수에서 다른 함수로 배열이나 문자열을 편리하게 보낼 수 있음

복잡한 자료구조를 효율적으로 처리

배열로 생성할 수 없는 데이터를 생성

메모리 공간을 효율적 사용

- call by reference에 의한 전역 변수의 사용을 억제

 

3. 포인터의 단점

 

포인터 변수는 주소를 직접적으로 컨트롤하기 때문에 예외 처리가 확실하지 않을 경우 예상치 못한 문제가 많이 발생. ( 널 포인트 같은 경우에 바로 접근할 경우 예외 발생)

선언만 하고 초기화를 하지않을 경우 쓰레기 주소를 가리키고 있기 때문에 사용에 주의해야 함.

포인터 변수는 주소를 직접 참조하기 때문에 의도하지않게 원본의 값이 수정 될 수 있다.

오류를 범하기 쉽고 기교적인 프로그램이 되기 쉽다.

프로그램의 이해와 버그 찾기가 어렵다.

메모리 절대 번지 접근 시 시스템 오류를 초래한다.

 

 하지만 단점 보다는 장점이 더 많아서 포인터를 사용한다고 한다.

 

 

4. 포인터와 배열의 차이

 배열과 포인터는 완전 같지는 않다고 한다그럼 차이점은 무엇일까?

 

포인터는 변수이지만 배열은 상수이다.

         int *p와 int arr[n]이 있다고 할 때, p는 고유의 메모리를 차지하고 있고 언제든지 다른 대상을 가르킬 수 있지만 arr는 선언 할 때 그 위치가 이

미 고정되므로 다른 대상을 가리킬 수 없다. arr로는 오로지 배열의 선두 번지를 읽을 수 있을 뿐이다.


가리키는 배열의 크키는 동적으로 결정할 수 있지만 arr이 가리키는 배열의 크기는 선언할 때 정적으로 결정된다.
 
고정된 길이의 배열이 필요하면 int arr[n]; 선언문으로 배열을 생성하는 것이 편리하고 가변길이의 배열이 필요하면 int *형의 포인터 변수를 선언한    malloc으로 할당해서 사용해야 한다포인터로 할당한 배열은 실행 중에라도 realloc으로 크기를 재할당하여 변경할 수 있다.
 
- 배열은 그 자체가 크기 때문에 함수의 인수로 전달할 수 없지만 포인터는 대상체가 무엇이든간에 4바이트와 크기밖에 차지하지 않으므로 함수로 전달할 수 있다
 
그래서 배열을 함수로 전달할 때는 반드시 포인터를 사용해야 한다

- 동작의 속도 차이가 있다
 
배열은 매번 배열선두에서부터 출발하지만 포인터는 대상체로 직접 이동해서 바로 읽으므로 액세스 속도가 빠르다. *p p가 가리키는 곳을 바로 읽지만ar[n] *(ar+n)으로 일단 번지를 더한 후 읽어야 하므로 조금 느리다포인터가 배열보다 두배 정도 빠르다.


출처 : http://blog.hyomin.xyz/10

'프로그래밍' 카테고리의 다른 글

C# , C++, JAVA 비교  (0) 2018.09.22

+ Recent posts